Python - zajęcia 4
Struktury danych
Zadaniem struktur jest przechowywanie i organiazowanie danych. Struktury mają wiele rodzajów ze względu na efektywnosć działania na danej strukturze i umozliwiający korzystanie w łatwy sposób przez programistów. Struktura niesie za Sobą korzyści np. programista w pythonie wie, że może je modyfikować i obsługiwać za pomocą powiązanych z nią metodami.
Listy
- Są modyfikowalne (mutable), co oznacza, że można je modyfikować (dodawać/odejmować elementy).
- Często przemieszczamy się w ich wypadku po elementch.
- Unika się raczej sięgania po elementy umieszczone w środku list.
- Struktura uporządkowana, którą deklaruje się za pomocą nawiasów kwadratowych [].
moje_ksiazki = ["harry potter", "Hobbit", "The animator's survival kit"]
print(moje_ksiazki)
print(type(moje_ksiazki))
W listach mieszanie typów jest raczej złym nawykiem:
kiepska_lista = ["pies", 1.32, True] #tak nie robimy
Krotki (tuple)
- Są niemodyfikowalne (immutable).
- Ich długość jest stała, w związku z tym programiści sięgają po elementy znajdujące się gdzie głęboko w nich.
- W krotkach można mieszać typy.
- Deklaruje się je za pomocą nawiasów okrągłych ().
kategorie menu = ("przystawki", "zupy", "desery")
mojakrotka = (1, 2, 3, 4)
print(mojakrotka)
print(type(mojakrotka))
topor = ("ciężki topór", 100 )
Listy i krotki
- Oba te elementy posiadają swoj indek który umożliwia jego szybkie odnalezienie.
- Mogą posiadać duplikaty
- I w listach jak i w krotkach można się przemieszczać (iterate) po ich elementach.
Indeksy
Służą do "wyciągnięcia" konkretnego elementu będącego częścią struktury. Aby go wyciągnąć, wpisujemy odpowiedni identyfikator w nawiasach kwadratowych [], po nazwie zmiennej. W przypadku wyciągnięcia czegoś z końca listy można sięgnąć po ostatni element wpisując ujemny indeks np. -1.
nazwa_zmiennej[inkes]
moja_lista = ["coś1", "coś2", "coś3", "coś4"]
print(moja_lista[1]) #Wynikiem będzie "coś2"
print(moja_lista[-1]) #Wynikiem będzie "coś4"
Uwaga
Trzeba mieć na uwadze, to że indeksy są liczone od 0 a nie od 1.

Cięcie list i krotek
Aby wyświetlić zakres elementów z listy lub krotki, potrzeba wpisać w nawiasie kwadratowym [] oddzielonymi dwukropkiem element startowy i końcowy.
moja_zmienna[start:koniec], przykładowo:
moja_lista = ["róża", "tulipan", "piwonie", "słonecznik"]
print(moja_lista[1:3]
Metody dla list i krotek
Są to funkcje "wbudowane" w dany obiekt. Wywołuje się je następująco:
nazwa_zmiennej.metoda()

Przykłady:
#kwiaty = ["róża", "tulipan", "piwonia", "słonecznik", "storczyk"] #lista
#przyroda = ("kwiaty", "chmury", "góry", "lasy", "zwierzęta") #krotka
.count()
przyroda = ["kwiaty", "chmury", "góry", "lasy", "kwiaty"]
rosliny = przyroda.count("kwiaty")
print (rosliny) #Wynikiem będzie liczba 2
przyroda = ("kwiaty", "chmury", "góry", "lasy", "kwiaty")
rosliny = przyroda.count("kwiaty")
print (rosliny) #Wynikiem będzie liczba 2
.index()
przyroda = ["kwiaty", "chmury", "góry", "lasy", "kwiaty"]
print (przyroda[1]) #Wynikiem będą "chmury"
przyroda = ["kwiaty", "chmury", "góry", "lasy", "kwiaty"]
lista = przyroda.index("chmury")
print (lista) #Wynikiem będzie liczba 1
przyroda = ["kwiaty", "chmury", "góry", "lasy", "kwiaty"]
print (przyroda[1:3]) #Wynikiem będą: chmury, góry
przyroda = ["kwiaty", "chmury", "góry", "lasy", "kwiaty"]
print (przyroda[2:]) #Wynikiem będą: góry, lasy, kwiaty
przyroda = ["kwiaty", "chmury", "góry", "lasy", "kwiaty"]
print (przyroda[0::2]) #Wynikiem będą: kwiaty, góry, kwiaty
przyroda = ("kwiaty", "chmury", "góry", "lasy", "kwiaty")
print (przyroda[1]) #Wynikiem będą "chmury"
przyroda = ("kwiaty", "chmury", "góry", "lasy", "kwiaty")
lista = przyroda.index("chmury")
print (lista) #Wynikiem będzie liczba 1
przyroda = ("kwiaty", "chmury", "góry", "lasy", "kwiaty")
print (przyroda[1:3]) #Wynikiem będą: chmury, góry
przyroda = ("kwiaty", "chmury", "góry", "lasy", "kwiaty")
print (przyroda[2:]) #Wynikiem będą: góry, lasy, kwiaty
przyroda = ("kwiaty", "chmury", "góry", "lasy", "kwiaty")
print (przyroda[0::2]) #Wynikiem będą: kwiaty, góry, kwiaty
.append()
kwiaty = ["róża", "tulipan", "piwonia", "słonecznik"]
kwiaty.append("storczyk")
print(kwiaty)
#Wynikiem będzie: róża, tulipan, piwonia, słonecznik i storczyk
kwiaty = ["róża", "tulipan", "piwonia", "słonecznik"]
kwiaty.append(input("Podaj kwiatka: "))
print(kwiaty)
#Wynikiem będzie: róża, tulipan, piwonia, słonecznik i kwiat podany przez uzytkownika
.pop()
kwiaty = ["róża", "tulipan", "piwonia", "słonecznik", "storczyk"]
kwiaty.pop(-1)
print(kwiaty)
#Wynikiem będzie: róża, tulipan, piwonia, słonecznik
.sort()
kwiaty = ["róża", "tulipan", "piwonia", "słonecznik", "storczyk"]
kwiaty.sort()
print(kwiaty)
#Wynikiem będzie: 'piwonia', 'róża', 'storczyk', 'słonecznik', 'tulipan'
kwiaty = ["róża", "tulipan", "piwonia", "słonecznik", "storczyk"]
kwiaty.sort(reverse=True)
print(kwiaty)
#Wynikiem będzie: 'tulipan', 'słonecznik', 'storczyk', 'róża', 'piwonia'
kwiaty = ["róża", "tulipan", "piwonia", "słonecznik", "storczyk"]
kwiaty.sort(key=len)
print(kwiaty)
#Wynikiem będzie: 'róża', 'tulipan', 'piwonia', 'storczyk', 'słonecznik'
.copy()
kwiaty = ["róża", "tulipan", "piwonia", "słonecznik", "storczyk"]
kwiaty.copy()
print(kwiaty)
#Wynikiem będzie: 'róża', 'tulipan', 'piwonia', 'słonecznik', 'storczyk'
Słowniki (ang. dictionary)
Jest to bardziej zaawansowana struktura, umożliwiająca szybsze odnalezienie jakiejś zawartości z pomocą wartości klucza przypisanego do niej.
Klucz MUSI być unikalny czyli NIE MOŻE się powtórzyć w słowniku, wartosci mogą być dowolne.
Klucz MUSI być wartością, na której da się wykonać tzw. funkcje skrótu. - podstawowe typy/struktury "niemodyfikowalne" (teksty, liczby, krotki) mogą być kluczem. Uwaga! w momencie kiedy krotka zawiera jakiś element modyfikowalny to przestaje nadawać się na klucz
Deklarujemy je:
moj_slownik = {"klucz1":"wartość1", "klucz2":"wartość2"}
przyroda = {
"kwiaty" : "róża",
"chmury" : "cumulus",
"zwierzęta" : "bober"
}
Aby wyświetlić wartość przechowywaną pod konkretnym kluczem podajemy w nawiasach kwadratowych klucz:
print(przyroda["kwiaty"])
Ważne jest aby być konsekwentnym przy tworzeniu słowników
Obsługa słownika
moj_slownik = {"klucz1" : "wartość1", "klucz2" : "wartość2"}
print(moj_slownik["klucz2"])
Dodanie nowego klucza
moj_slownik[nowy_klucz] = wartość
moj_slownik = {"klucz1" : "wartość1", "klucz2" : "wartość2"}
moj_slownik["klucz3"] = "wartość3"
print(moj_slownik)
Słowniki - metody

Przykłady:
.keys()
moj_slownik = {"klucz1" : "wartość1", "klucz2" : "wartość2"}
klucze = moj_slownik.keys()
print(klucze)
#Wynikiem będzie: klucz1, klucz2
.values()
moj_slownik = {"klucz1" : "wartość1", "klucz2" : "wartość2"}
wartość = moj_slownik.values()
print(wartość)
#Wynikiem będzie: 'wartość1', 'wartość2'
.pop()
moj_slownik = {"klucz1" : "wartość1", "klucz2" : "wartość2"}
moj_slownik.pop("klucz2")
print(moj_slownik)
#Wynikiem będzie: 'klucz1': 'wartość1'
.items()
Jeszcze nie ogarniam :c
.get()
moj_slownik = {"klucz1" : "wartość1", "klucz2" : "wartość2"}
print(moj_slownik.get("klucz2"))
# #Wynikiem będzie: wartość2
Jak dodać słownik do słownika
- Metoda scalony:
**{moj_slownik1,moj_slownik2}
moj_slownik1 = { "klucz1": "wartość1", "klucz2": "wartość2", }
moj_slownik2 = { "zwierze1": "pies", "zwierze2": "chomik", }
scalony = {**moj_slownik1, **moj_slownik2}
print("scalony:")
print(scalony)
- Metoda .update:
moj_slownik1.update(moj_slownik2)
moj_slownik1 = { "klucz1": "wartość1", "klucz2": "wartość2", }
moj_slownik2 = { "zwierze1": "pies", "zwierze2": "chomik", }
moj_slownik1.update(moj_slownik2)
print(moj_slownik1)
Zbiory
Wyglądają podobnie do listy, z tym że nie posiadają duplikatów co wiąże się z tym, że jeżeli spróbujemy dodać coś dwa razy do zbioru np."róża" to ten drugi zostanie usunięty. Brak powtórzeń jest wykorzystywany np. przy zmianie listy na zbiór, żeby pozbyć się duplikatów.
Nie posiadają indeksów.
Można o nich myśleć jak o takich dziwnych słownikach, które mają jedynie klucze.
Deklaruje sie je za pomocą nawiasów klamrowych {}.
moj_zbior = {unikat1, unikat2, unikat3}
prosty_zbior = {"pies", "kot", "rybka"}
print(prosty_zbior)
Zmiana listy na zbiór i z powrotem
ksiazki = ["Endymion", "Hobbit", "Fundacja", "Endymion"]
zbior_ksiazek = set(ksiazki)
ksiazki_bez_powtorzen = list(zbior_ksiazek)
Struktury mieszane
Elementem słownika, listy czy krotki może być inny słownik, lista, krotka, przykładowo:
rig ={
"left_arm" : ["arm02", "arm03", "arm04", "arm05"]
}
print(rig["left_arm"][2])
Typy modyfikowalne i niemodyfikowalne

Zadanie
krotka = ("dobrze", "źle")
pytania = {"pytanie1":"Ile to 2=2 \na) 2 \nb) 0 \nc) 4",
"pytanie2":"Ile to 1=1 \na) 7 \nb) 2 \nc) 6"}
print(pytania.get("pytanie1"))
odp = (input("odp.a b lub c: "))
if odp == "c":
print (krotka[0])
else:
print (krotka[1])
print(pytania.get("pytanie2"))
odp = (input("odp.a b lub c: "))
if odp == "b":
print (krotka[0])
else:
print (krotka[1])