Python_notatki Z4
Ctrl+H - w VS Code znajd i zamień (na przykład nazwę zmiennej)
Dobór struktur danych jest ważny przy budowaniu aplikacji, które mają się rozwijać się i rosnąć.
Struktury danych! i obsługa struktur danych.


Listy a krotki:


Listy są MODYFIKOWALNE.
Czy jest limit ilości elementów, które można zapisać do listy? Tylko pamięć komputera.

Krotki są NIEMODYFIKOWALNE.

Jak odwołać się do konkretnego elementu pod konkretnym indeksem:


Nie możemy podać indeksu, który jest większy od długości listy/krotki. Jak i podać indeks z minusem, który jest odpowiednikiem indeksu 0.

Nie wrzucać do środka krotki listy, to jest zły pomysł.
Można mieszać rodzaje danych na listach i na krotkach: na przykład integer, i float, i boolean, i krotka w liście, i string.
Wyciąganie elementów z zagłębionej listy w liście lub krotki w liście:
print(lista_mieszana[4][-1])
Każdy kolejny nawias kwadratowy do coraz głębszej struktury danych.


start wchodzi w zakres danych, koniec nie wchodzi w zakres danych.


Czy w ogóle mamy jakiś element na naszej liście lub krotce? Można to sprawdzić za pomocą if:

String zachowuje się podobnie do krotki, i dlatego każda litera w string ma swój indeks:

Więcej podobieństw między krotką a ciągiem znaków, niż krotką a listą.
Operacje na listach:
Można dodawać do siebie listy.




Jest o wiele więcej dostępnych metod do list. Patrz dokumentacje Pythona.
.append zachowuje się inaczej niż dodawanie do list

jeżeli nie podać atrybutu do .pop, to usunie ostatni element


Do .pop podajemy indeks elementu, bez nawiasu kwadratowego.

.pop też zwraca nam wartość wyciętego elementu, i można ją ewentualnie przechować w innej zmiennej.
SORTOWANIE!!!! .sort - sortuje rosnąco. Ale można i malejąco, patrz dokumantacje Pythona.

.copy

Można posortować listę alfabetycznie metodą .sort. Dla stringów automatycznie alfabetycznie. Bo do liter są też przypisane standardowe numery według tabeli, i jest to w pewnym sensie sortowanie rosnąco.


funkcja .len do długości listy lub krotki


lista [1,2,3] a lista [3,2,1] to różne listy. Kolejność elementów na liście ma znaczenie.
id listy ma znaczenie też, bo wszystko z tym samym id będzie zmieniać się razem, jeżeli jest to modyfikowalne. To wynika z ograniczeń i potrzebowań zarządzania pamięcią komputera i pamięcią operacyjną i jest w tym dużo dziwnych myków, których na razie nie rozumiem, ale muszę zaufać, że ktoś już się na tym naciął i musiał przemyślieć.
Słowniki (dictionary):

nawiasy klamrowe {klucz:wartość}
klucz musi być unikalny, nie mogą się powtarzać.
klucz - koniecznie niemodyfikowalny. Nie może być kluczem lista, czy słownik. Można wykonać na kluczu funkcję sktótu (hash). Zamienia klucz na ciąg znaków i on jest unikatowy.





do slownik.pop() nie można zostawić właśnie takie puste nawiasy!!!!!
kolejność danych w słowniku może się zmianić. chyba. nie ma gwarancji kolejności danych.
w słownikach nie ma indeksów

krotka może być kluczem. ale nie może być kluczem krotka która zawiera listę
inny słownik może być wartością w słowniku




zmienna a to 1, zmienna b to 2
Słowników nie dodajemy + plusem. robimy metodę .update.

bonus:

Zbiory (sets):

set to dziwny słownik, który na tylko klucze.... ale też nie na indeksów. Trudno wyciągać wartości z niego. Używa się często do usuwania duplikatów

tak pozbywamy się duplikatów
niemodyfikowalny = ummutable

różnice w szybkości róźnych struktur danych: lista i słownik

słownik długo się tworzy natomiast, więc lepiej już z niego później korzystać

python umożliwia podmienianie elementów w miejscu bez tworzenia tymczasowych dodatkowych zmiennych
Wykonać zadanie domowe 😄
Zadanie domowe: dokończyć zadania.py; zastanowić się, do jakiej struktury danych wrzucić pytania i td do kwestionariusza.
Czy możemy wymyślić taką strukturę danych, żeby wyświetlać pytania w losowej kolejności? A pytania i odpowiedzi w losowej kolejności? Spiąć odpowiedzi z punktami za odpowiedzi tak, aby nie zmieniać literki do poprawnej odpowiedzi w kodzie? Mieć możliwość wyboru kilku poprawnych odpowiedzi do jednego pytania? Jakie będą konsekwencje każdego takiego wyboru struktury danych?
Może tak?
import string
string.ascii_lowercase
alfabet = list(string.ascii_lowercase)
import random
wyniki = 0
right_answers = []
user_answers = []
kwestionariusz = {0:["pytanie1",["odp1.1","**odp1.2","odp1.3"]],
1:["pytanie2",["odp2.1","**odp2.2","**odp2.3"]],
2:["pytanie3",["**odp3.1","odp3.2"]]}
for i in kwestionariusz:
print(kwestionariusz[i][0])
random.shuffle(kwestionariusz[i][1])
cut_alfabet = alfabet[:len(kwestionariusz[i][1])]
temp_answers = []
for j in kwestionariusz[i][1]:
if kwestionariusz[i][1][j].count("**"):
temp_answers.append(cut_alfabet[j])
kwestionariusz[i][1][j]=kwestionariusz[i][1][j].replace("**", "")
print(f"{cut_alfabet[j]}{kwestionariusz[i][1][j]}")
right_answers.append(temp_answers)
temp_answers.clear()
temp_input_answer = input("Wpisz literę z odpowiedzią (lub kilka dla pytań zaznaczonych *): ")
temp_input_answer = temp_input_answer.replace(",","")
temp_input_answer = temp_input_answer.replace(" ","")
temp_list_answer = list(temp_input_answer.lower())
user_answers.append(temp_list_answer)
for i in user_answers:
if user_answers[i] == right_answers[i]:
wyniki += 1
a=i+1
print(f"Odpowiedź na pytanie {a} jest poprawna")
else:
print(f"Odpowiedź na pytanie {a} nie jest poprawna")
print(f"\n ********** \n Twoj wynik to {wyniki} punktów z {len(kwestionariusz)} możliwych.\n ********** ")
if wyniki<(len(kwestionariusz)/3):
print("Powtórz temat, bardzo źle")
elif wyniki<(len(kwestionariusz)/3*2):
print("Nieźle, ale mogło być lepiej")
else:
print("Swietny wynik!!! Gratulacje! Po wygraną zgłoś się do Przemka :-)")
Kod poprawiony i działa, choć może być nieoptymalny:
import string
string.ascii_lowercase
alfabet = list(string.ascii_lowercase)
import random
wyniki = 0
right_answers = []
user_answers = []
kwestionariusz = [["pytanie1",["odp1.1","**odp1.2","odp1.3"]],
["* pytanie2",["odp2.1","**odp2.2","**odp2.3"]],
["pytanie3",["**odp3.1","odp3.2"]]]
for i in range(len(kwestionariusz)):
print(kwestionariusz[i][0])
random.shuffle(kwestionariusz[i][1])
cut_alfabet = alfabet[:len(kwestionariusz[i][1])]
temp_answers = []
for j in range(len(kwestionariusz[i][1])):
if kwestionariusz[i][1][j].count("**"):
temp_answers.append(cut_alfabet[j])
kwestionariusz[i][1][j]=kwestionariusz[i][1][j].replace("**", "")
# print(cut_alfabet[j])
print(cut_alfabet[j], ".", kwestionariusz[i][1][j])
right_answers.append(temp_answers)
# print(right_answers)
# temp_answers.clear()
print("Pytania zaznaczone * mają kilka poprawnych odpowiedzi. \nWpisywaj litery jedna za drugą bez przecinków i spacji.")
temp_input_answer = input("Wpisz literę z odpowiedzią: ")
print("_______________________________")
temp_input_answer = temp_input_answer.replace(",","")
temp_input_answer = temp_input_answer.replace(" ","")
temp_list_answer = list(temp_input_answer.lower())
user_answers.append(temp_list_answer)
for i in range(len(user_answers)):
a=i+1
if user_answers[i] == right_answers[i]:
wyniki += 1
print(f"Odpowiedź na pytanie {a} jest poprawna")
else:
print(f"Odpowiedź na pytanie {a} nie jest poprawna")
print(f"\n ********** \n Twoj wynik to {wyniki} punktów z {len(kwestionariusz)} możliwych.\n ********** ")
if wyniki<(len(kwestionariusz)/3):
print("Powtórz temat, bardzo źle")
elif wyniki<(len(kwestionariusz)/3*2):
print("Nieźle, ale mogło być lepiej")
else:
print("Swietny wynik!!! Gratulacje! Po wygraną zgłoś się do Przemka :-)")