Lekcja 4 - struktury danych, metody (notatki)

Struktury danych
„Struktury danych odgrywają kluczową rolę w przechowywaniu i organizowaniu danych w aplikacji. Ważne jest, aby wybrać odpowiednią strukturę danych, aby znacząco poprawić wydajność aplikacji, ponieważ bardzo pożądane jest, aby móc skalować aplikację wraz ze wzrostem ilości danych”.
Struktury danych są rodzajem miejsca na przechowywanie obiektów. Wyróżniamy listy (ang. lists), krotki (ang. tuple), słowniki (ang. dictionary) oraz zbiory (ang. set).
Krotka to niemodyfikowalny, uporządkowany zestaw elementów (liczb i/lub stringów) zamknięty w nawiasach okrągłych np. moja_krotka = ("coś1", "coś2", "coś3"). Elementy mają przypisane do siebie miejsca oznaczane kolejnym liczbami począwszy od zera. A zatem "cos1" znajduje się na pozycji 0, zaś "coś2" na 1.
kategorie_menu = ("przystawki", "zupy", "dania główne", "desery")
print(kategorie_menu[1])
Wyświetli "zupy"
Listy to modyfikowalny, uporządkowany zestaw elementów (liczb i/lub stringów) zamknięty w nawiasach kwadratowych np. moja_lista = ["coś1", "coś2", "coś3"]. Elementy na liście mogą się powtarzać.
Indeks to sposób by sięgnąć po konkretny element listy / krotki, zgodnie ze wzorem nazwa_zmiennej[indeks].
moje_kolory = ["black", "red", "white", "green"]
print(moje_kolory[1])
Wyświetli element na pozycji pierwszej czyli "red".
moje_kolory = ("black", "red", "white", "green")
print(moje_kolory[1:]
Wyświetli element na pozycjach od pierwszej do końca czyli 'red', 'white', 'green'.
moje_kolory = ("black", "red", "white", "green")
print(moje_kolory[1:3]
Wyświetli element na pozycjach od pierwszej do drugiej (tnie przed trzecią) czyli 'red', 'white'.
moje_kolory = ("black", "red", "white", "green")
print(moje_kolory[-1]
Wyświetli element na ostatniej pozycji (pierwsza od końca) czyli 'green'.
moje_kolory = ("black", "red", "white", "green")
print(moje_kolory[-2:]
Wyświetli elementy na dwóch pozycjach od końca czyli 'white', 'green'.
Listy i krotki możemy łączyć np.
moja_lista = [(2, 5), (1, 2), (4, 4)]
W środku listy znajduja się trzy krotki.
Słowniki (ang. dictionary)
Słownik to zestaw przypisanych do kluczy wartości. Tworzy się go zgodnie ze wzorem: moj_slownik = {klucz : wartość}. Kluczem może być string, liczba lub krotka, ale nie lista, ponieważ musi to być element unikalny i niemodyfikowalny. Jeżeli klucz nie będzie unikalny to zostanie nadpisany. Lepiej nie mieszać w jednym słowniku kluczy będących liczbami i stringami, choć python nie wyrzuci błędu.
moj_slownik = {
"klucz1" : "wartość1",
"klucz2" : "wartość2",
"klucz3" : "wartość3",
"klucz4" : "wartość4",
"klucz5" : "wartość5",
}
print(moj_slownik["klucz2"])
print(moj_slownik["klucz4"][1])
Wyświetli wartość2, oraz a. Ponieważ potraktuje wartość4 jak listę i wyświetli 2 element z nie czyli literę a.
moje_zdanie + "Ala ma kota - powiedział Stefan"
lista_slow = moje_zdanie.split()
print(lista_slow)
print(len(lista_slow))
Metody
Metoda - funkcja przypisana do obiektu, tworzona zgodnie ze wzorem nazwa_zmiennej.nazwa_metody(atrybuty).
Append - dodaje coś na koniec listy. Nie stosuje się w krotkach.
Count - zlicza ilość wystąpień wskazanego parametru.
Index - pokazuje czy wskazany element jest na liście i w którym miejscu
moje_kolory = ["black", "red", "white", "green", "black"]
print(moje_kolory.index("black"))
Wyświetli 0 (bo pierwszy "black" znajduje się na tej pozycji. Nie wskaże już jednak miejsca kolejnych powtórzeń, jeśli takie są.
Pop - usuwa element o podanym indeksie z listy, jeśli nie podamy indeksu usunie ostatni element na liście. Nie stosuje się w krotkach.
moje_kolory = ["black", "red", "white", "green", "black"]
moje_kolory.pop()
print(moje_kolory)
Wyświetli: 'black', 'red', 'white', 'green'.
Sort - sortuje elementy na liście. Nie stosuje się w krotkach.
Copy - zwraca kopię obiektu. Nie stosuje się w krotkach.
Len - pokazuje ile elementów zawiera lista.
moje_kolory = ["black", "red", "white", "green", "black"]
print(len(moje_kolory))
Wyświetli
List - zmienia krotkę na listę.
Tuple - zmienia listę na krotkę.
Split - rozdziela ciąg znaków i tworzy listę.
Metody dla słowników
Update - dodaje elementy do słownika, bo w przypadku słowników operacja dodawania nie jest możliwa.
Keys - zwraca listę kluczy słownika.
Values - zwraca listę wartości słownika.
Pop - usuwa element o podanym kluczu.
Items - zwraca listę krotek dla każdej pary
Get - zwraca wartość danego klucza.
Zbiory (ang. set)
Zbiór to zestaw elementów, w którym ich kolejność jest nieistotna, ale nie może być powtórzeń. Przez to nie można też użyć wobec nich indeksów.
moj_zbiór = {"unikat1", "unikat2", unikat3"}
ĆWICZENIE 1
Stwórz grę "Kamień, papier, nożyce"
import random
wybory = ("papier", "nożyce", "kamień")
wybor_komputera = random.choice(wybory)
print("""Co wybierasz?
a. kamień
b. papier
c. nożyce""")
wybor_gracza = input("Twój wybór to (podaj literę): ")
print("Wybór komputera to:" + wybor_komputera)
if wybor_komputera == "kamień" and wybor_gracza.lower() == "a":
print("Remis!")
elif wybor_komputera == "kamień" and wybor_gracza.lower() == "b":
print("Przegrałeś!")
elif wybor_komputera == "kamień" and wybor_gracza.lower() == "c":
print("Brawo!")
elif wybor_komputera == "papier" and wybor_gracza.lower() == "a":
print("Brawo!")
elif wybor_komputera == "papier" and wybor_gracza.lower() == "b":
print("Remis!")
elif wybor_komputera == "papier" and wybor_gracza.lower() == "c":
print("Przegrałeś!")
elif wybor_komputera == "nożyce" and wybor_gracza.lower() == "a":
print("Brawo!")
elif wybor_komputera == "nożyce" and wybor_gracza.lower() == "b":
print("Przegrałeś!")
else:
print("Remis!")
ĆWICZENIE 2
Udoskonalamy nasz kwestionariusz, poprzez wzbogacenie go o: losowanie pytań, losowe odpowiedzi, wyświetlenie maksymalnego wyniku, pulę pytań i pokazanie prawidłowych odpowiedzi pod koniec.
Wpierw odpowiedzmy sobie na pytania:
Jak przechowywać wyniki wielu uczestników? Chyba najlepiej za pomocą słownika - w ten sposób nick uczestnika byłby kluczem, a zdobyte przez niego punkty przypisaną do niego wartością. Trzeba by było tylko sprawdzać czy nick wprowadzony przez gracza nie został wcześniej wybrany przez kogoś innego (musi być unikalny i niepowtarzalny), żeby wartość nie została nadpisana. Dzięki temu można by wyświetlać tabelę wyników za pomocą items. Ale jak posortować wyniki graczy od największego do najmniejszego?
Jak przechowywać pytania? Z jakimi konsekwencjami się to wiąże? Może za pomocą kombinacji słownika i listy. Tak by pytanie było kluczem a odpowiedzi listą.
Pytania = {"Kiedy odbyła się bitwa pod Grunwaldem?" : ["1410", "1415", "1310", "1450"]}
Jak skonstruować pytanie tak, aby możliwe było wyświetlenie odpowiedzi w losowej kolejności? Chyba za pomocą "random", jeśli można użyć jej na liście będącej jednocześnie wartością w słowniku.
Czy możliwe jest zliczanie pkt. gdy wiele odpowiedzi jest poprawnych? Trzeba by za pomocą "split" podzielić stringa będącego odpowiedzią gracza (input), tak by stworzył nam z odpowiedzi gracza listę. A następnie za pomocą if sprawdzać czy na liście jest najpierw jedna, a potem druga dobra odpowiedź i w obu przypadkach użyć if (żeby python nie mógł pominąć wiersza jak w przypadku elif) i przypisać do nich warunek o zwiększenie wartości.