Python - zajęcia 4

  • Struktury danych
  • Metody

Struktury danych: listy, krotki, słowniki, zbiory.

The AI workspace that works for you. | Notion
A tool that connects everyday work into one space. It gives you and your teams AI tools—search, writing, note-taking—inside an all-in-one, flexible workspace.

📝Moje notatki

💭
Typ danych do kwestionariusza

Zastanówcie się w jakiej strukturze danych można by było przechowywać quiz / kwestionariusz.
Ustaliliśmy, że wyniki uczestników quizu będziemy przechowywać w osobnej strukturze (i innej zmiennej).


Zasugerowałyście, że istotna są dla Was:
• pytania bez powtórzeń
• łatwość zmiany kolejności wyświetlania odpowiedzi
• odp. i pkt. w tym samym miejscu / tej samej strukturze
• kolejność przechowania punktów za odp i samego wariantu odpowiedzi ma znaczenie. Warto to zaznaczyć przy wyborze struktury danych

💡
1. Do przechowywania pytań najsensowniejszym rozwiązaniem wydaje się być lista słowników. Słowniki miałby trzy klucze:
  • pytanie

  • odpowiedzi

  • poprawna_odpowiedz

    Przykład:
    {
    "pytanie": "Jaki jest wynik 2+2?",
    "odpowiedzi": ["1", "4", "22"],
    "poprawna_odpowiedz": "4"
    }

To, że byłaby to lista słowników powoduje, że możemy zmieniać kolejność pytań. Również to, że podpowiedzi a,b,c byłyby przechowywane jako lista dają możliwość mieszania. Dodatkowo słownik daję porządek i pozwala na odwołanie się do pytania czy poprawnej odpowiedzi.
  1. Do przechowywania odpowiedzi użytkownika i punktów użyłabym listy.
💻
Kod i zadania

# 1. Get the smallest number from a list
# m = [2, 6, 1, 4, 5]


# def smallest_num_in_list(list):
#     list.sort()
#     print(list)


# smallest_num_in_list(m)


# 2.  Count Strings with Same Start and End
# Write a Python program to count the number of strings from a given list of strings. The string length is 2 or more and the first and last characters are the same.
# Sample List : ['abc', 'xyz', 'aba', '1221']
# Expected Result : 2


# list =  # ['abc', 'xyz', 'aba', '1221']
# list = ['abc', 'xyz', 'aba', '1221', '11211', '111', '23432']
# ile = 0
# for string in list:
#     if len(string) >= 2:
#         start = string[0]
#         end = string[-1]
#         if start == end:
#             ile += 1
# print(ile)


# 3. Sort Tuples by Last Element

# Write a Python program to get a list, sorted in increasing order by the last element in
# each tuple from a given list
# of non-empty tuples.
# Sample List : [(2, 5), (1, 2), (4, 4), (2, 3), (2, 1)]
# lista = [(2, 5), (1, 2), (4, 4), (2, 3), (2, 1)]

# lista.sort(key=lambda x: x[0])
# print(lista)

# # lambda jest często używana w Pythonie w takich funkcjach jak:
# # sorted()
# # map()
# # filter()
# # max() / min() z parametrem key

# 4. Remove Duplicates from List
# Write a Python program to remove duplicates from a list.
# lista = [2, 5, 1, 2, 4, 4, 2, 3, 2, 1]
# or = set(lista)
# print(or)
# lista = list(or)
# print(lista)


# # 5.Check if List is Empty
# # Write a Python program to check if a list is empty or not.

# def sprawdz_czy_lista_pusta(list):
#     if list:
#         print('Lista jest gitówa!')
#     else:
#         print('Lista jest pusta!')


# sprawdz_czy_lista_pusta([])

# # 6. Clone or Copy a List
# lista1 = [2, 5, 1, 2, 4, 4, 2, 3, 2, 1]
# lista2= lista1

# # 7. Find Words Longer Than n
# # Write a Python program to find the list of words that are longer than n from a given list of words.

# lista_slow = ['mango', 'koń', 'kot', 'gruszka', 'meble']
# dlugie_slowa = list()
# for index in range(len(lista_slow)):
#     if len(lista_slow[index]) > 3:
#         dlugie_slowa.append(lista_slow[index])
# print(dlugie_slowa)


# def wypluj_dlugie_slowa(lista, n):
#     dlugie_slowa = list()
#     for index in range(len(lista)):
#         if len(lista[index]) > n:
#             dlugie_slowa.append(lista[index])
#     print(dlugie_slowa)


# wypluj_dlugie_slowa(['mango', 'koń', 'kot', 'gruszka', 'meble'], 5)

# lista - deklarujemy z uzyciem []
# # mozemy przechowywac na niej str, int, float, listy, słowniki....
# # jest modyfikowalna (mutable)

# jakas_lista = []

# # fajnie gdy nie mieszamy typów na liście

# mojalista =
# # fajnie gdy nie mieszamy typów na liście

# zwierzeta = ['pies']
# zwierzeta. append("koń")
# print(zwierzeta)

# rosliny = ["kaktus", "drzewo"]

# print(rosliny)
# natura = rosliny + zwierzeta

# print(natura)


# # krotka - na pierwszy rzut oka podobna do listy
# # ... ale niemodyfikowalna (immutable)

# mojakrotka = (1, 2, 3, 4)
# print(mojakrotka)
# print(type(mojakrotka))


# topor = ("ciezki topór", 100) #ekwipunek gracza


# # # dodawanie elemntów do listy


# lista_treningowa = ["test1", "test2", ["test3", "test4"]]
# print(lista_treningowa[-1][-2])

# lista_treningowa.insert([-1], "moja")
# print(lista_treningowa)

# moje_ksiazki = ["Blade Runner", "Hobbit", "Unicorn Project"]

# # dodaj książkę

# # konkretyny element listy/krotki mozemy "wyciagnac"
# # uzywajac indeksu wpisanego w nawiasach kwadratowych.
# # Indeksy zaczynają się od 0 !!!


# kategorie_menu = ("przystawki", "zupy", "dania główne", "desery")

# #                0        1       2      3
# moja_lista = ["cos1", "cos2", "cos3", "cos4"]


# # wyświetl pierwszą książkę
# print(moje_ksiazki[0])

# # wyświetl ostatnią książkę
# print(moje_ksiazki[-1])


# # krotka - dobra do kolekcji o stałej zawartości
# # częściej w niej mieszamy typy,
# # sięgamy po elementy w środku etc ( - bo jej długość jest niezmienna)

# kategorie_menu = ("przystawki", "zupy", "dania główne", "desery")


# print(kategorie_menu[0])
# print(kategorie_menu[-1])

# # jak dodać do poniższej listy zakupów "mango"?

# zakupy = ["miód", "pieprz", "jogurt", "sałata"]
# # metoda append
# zakupy.append("mango")
# print(zakupy)
# print("ilość elementów w liście \"Zakupy\" ", len(zakupy))


# print(zakupy[1:]) ==> print(zakupy[1:-1])
# zakupy.append("truskawki")
# zakupy.append("śliwki")
# print(zakupy)
# zakupy.append("śliwki")
# zakupy.append("śliwki")

# print(zakupy)
# print(zakupy.count("śliwki"))

# print("ilość elementów w liście \"Zakupy\" ", len(zakupy))

# Lista w liście:

# zwierzaki = ["pies", "kot", ["neonki", "danio", "hokejówki"]]
# print(zwierzaki[2][1])

# Aby wybierał co 2 element:
# print(zakupy[1::2]) # od 1 do końca, co drugi element


# kolekcje: listy, krotki, słowniki
# # jak sprawdzić indeks elementu

# print(zakupy.index("pieprz"))

# # jak zliczyć ilość wystąpień?
# # Należy użyć metody count
# print(f"ilość śliwek na liście: {zakupy.count("śliwki")}")

# # jak połączyć spożywcze i higiena w jedną listę "wszystkie_zakupy"?

# spozywcze = ["miód", "pieprz", "jogurt", "sałata"]
# higiena = ["mydło", "pasta do zębów"]

# print(spozywcze+higiena)


# # jeśli listy / krotki mają wiele elementów to możemy zapisywać je w osobnych wierszach np.

# punkty_doswiadczenia = [
#     100,
#     200,
#     765,
#     432,
#     128,
#     905,
# ]
# print(punkty_doswiadczenia[-3:])

# # wyswietl 3 ostatnie element listy i 2 ostatnie element krotki

# mojalista = ["a", "b", "c", "d", "e"]

# mojakrotka = (1, 2, 3, 4)

# print(mojalista[-3:], mojakrotka[-2:])

# # # a jak wyswietlic 3 litere ponizszego ciagu znaków?

# tekst = "Lorem ipsum"

# print(tekst[2])

# # jakies wnioski?

# #  jak wyswietlic drugi element listy? (czyli orange)

# mojalista = ["red", "orange", "green", "blue", "white"]

# print(mojalista[1])

# # # jak wyswietlic "orange", "green", "blue"?
# print(mojalista[1] + ', ' + mojalista[2]+', ' + mojalista[3])
# print(str(mojalista[1:4]))
# print(", ".join(mojalista[1:4]))
# print("^".join(mojalista[1:4]))
# # # jak wyświetlić ostatni element?
# print(mojalista[-1])
# # mając poniższą listę:

# moje_zakupy = ["miód", "pieprz", "jogurt", "sałata", "mango"]


# # jak zamienić "mango" na "jabłka"?

# moje_zakupy[-1]="jabłka"

# # jak spradzić czy na liście jest "sól"?
# print(moje_zakupy.count("sól"))

# # jak wyświetlić użytkownikowi komunikat, że trzeba ją kupić (gdy nie ma)
# -> Przyjmuję, ze gdy nie ma na liście zakupów soli to wyświetlam komunikat
# if moje_zakupy.count("sól") == 0:
#     print("Nie zapomnij kupić soli - nie masz jej na liście!")
# else:
#     print("Masz sól na liście: kup ją bo jajecznica będzie słaba!")

# # jak napisać instrukcję, która sprawdzi
# # czy na liście są jakieś elementy?
# if len(moje_zakupy) != 0:
#     print("Są zakupy do zrobienia.")
# else:
#     print("Wszystko jest :)\nNie wchodź do żabki, bo znowu wydasz pieniądze na głupoty")

# # Jeśli tak - wyświetli "Są zakupy do zrobienia.".
# # Jeśli nie - "Wszystko jest :)."

# # Czy nie fajnie by było mieć funkcję,
# # która przyjmie jako argument dowolną listę zakupów ;)?
# azak = moje_zakupy


# def lista_pusta(azak):
#     if len(azak) != 0:
#         print("Są zakupy do zrobienia.")

#     else:
#         print(
#             "Wszystko jest :)\nNie wchodź do żabki, bo znowu wydasz pieniądze na głupoty!")


# lista_pusta(moje_zakupy)
# print("*"*15)
# lista_pusta([])


# # # ile elementów ma poniższa lista? czy jest poprawna?

# mojalista2 = [(2, 5), (1, 2), (4, 4), (2, 3), (2, 1)]
# # Ma 5 elementów i jest poprawna. Trzymamy się konwencji by nie mieszać typów. A tu są same krotki

# # # jaki indeks ma ostatni element? -> 4
# # # Jak to sprawdzić wykorzystując funkcję len?
# print(f"ostatni element w mojalista2 ma indeks: {len(mojalista2)-1}")

# # czy poniższa operacja będzie ok? -> TAK

# mojalista = ["red", "orange", "green", "blue", "white"]
# print(f"Przed append: {mojalista}")
# mojalista.append("black")
# print(f"Po append: {mojalista}")

# # czy poniższa operacja będzie ok? -> tak

# mojalista = ["a", "b", "c", "d", "e"]
# mojalista += ["white"]
# print(mojalista)
# print(f"Ta lista ma {len(mojalista)} elementów.")

# # # czy poniższa operacja będzie ok? A jeśli tak - jaki będzie wynik? -> Tak pojawi się black na końcu początkowej listy

# mojalista = ["a", "b", "c", "d", "e"]
# mojalista.append("black")
# print(mojalista)


# # # czy poniższa operacja będzie ok? -> tak

# mojalista = ["a", "b", "c", "d", "e"]
# mojalista.pop(1)
# print(mojalista)

# # czy poniższa operacja będzie ok? -> Tak, choć na listach nie powinniśmy mieszać typów

# mojalista = ["a", "b", "c", "d", "e"]
# mojalista += [2]
# print(mojalista)

# # # czy poniższa operacja będzie ok?-> Tak, choć na listach nie powinniśmy mieszać typów

# # mojalista = ["a", "b", "c", "d", "e"]
# # mojalista += (1, 2, 3)

# # czy poniższa operacja będzie ok?-> TAK

# mojalista = [1, 2, 3]
# mojalista2 = [3, 4]
# sklejone = mojalista + mojalista2

# # gracz ma w ekwipunku skladniki
# # jesli ma mana potion i magic dust powinien dostac greater mana potion
# # ... a skladniki do niego powinny zostac usuniete

# ekwipunek = ["mana potion", "mushroom", "magic dust"]
# if "mana potion" in ekwipunek and "magic dust" in ekwipunek:
#     ekwipunek.remove("mana potion")
#     ekwipunek.remove("magic dust")
#     ekwipunek.append("greater mana potion")
# print(ekwipunek)


# # czy poniższa operacja będzie ok? -> tak

# mojakrotka = (1, 2, 3)
# mojakrotka2 = (3, 4)
# sklejone = mojakrotka + mojakrotka2
# print(sklejone)

# # czy poniższa operacja będzie ok? -> Nie, krotki są niemodfikowalne i nie mają metody append

# krotka1 = ("red", "orange", "green")
# krotka1.append("white")

# # czy poniższa operacja będzie ok? -> Nie, krotki są niemodfikowalne

# krotka1 = ("red", "orange", "green")
# krotka1 += "white"

# # # czy poniższa operacja będzie ok? -> Nie, krotki są niemodfikowalne

# krotka1 = ("red", "orange", "green")
# krotka2 = krotka1 + ("white")


# # a tak? tak, bo krotka2 się dopiero tworzy

# krotka1 = ("red", "orange", "green")
# krotka2 = krotka1 + ("white",)


# dziwna_krotka = ("Aragorn", [100, 100])

# dziwna_krotka[1][0] -= 30
# print(dziwna_krotka)  # -> da nam wynik ("Aragorn", [70, 100])


# # jak policzysz ilość słów w poniższym zdaniu?


# print(moje_zdanie.count(' ')      )
# len(moje_zdanie[start:index])
# print(moje_zdanie.find(' '))
# print(4+moje_zdanie[3+1:].find(' '))

# moje_zdanie = "Ala ma kota - powiedział Stefan."
# ilosc_slow = 0
# start = 0
# index = 0
# koniec = len(moje_zdanie)
# while index < koniec:
#     if moje_zdanie[start:].find(' ') > 0:
#         index = moje_zdanie[start:].find(' ')
#     else:
#         index = koniec

#     if len(moje_zdanie[start:start+index]) >= 2:
#         ilosc_slow += 1
#     print(
#         f"start: {start}, indeks: {index}, slowo: {moje_zdanie[start:start+index]}")
#     start += 1 + index  # żeby ominąć tę spację +1

# print(f"\n\n{"*"*20}\nIlość słow w zdaniu: {ilosc_slow}")

# ******************************
# Ver 2: po prysznicu xD
# ******************************
# moje_zdanie = "Ala ma kota - powiedział Stefan."


# ilosc_slow = 0
# start = 0
# index = 0
# koniec = len(moje_zdanie)
# while index < koniec:
#     if moje_zdanie[start:].find(' ') > 0:
#         index = moje_zdanie[start:].find(' ')
#     else:
#         index = koniec

#     if (moje_zdanie[start:start+index].isalpha() or moje_zdanie[start:start+index][-1] in {".", ","}):
#         ilosc_slow += 1

#     print(
#         f"start: {start}, indeks: {index}, slowo: {moje_zdanie[start:start+index]}, znaki {moje_zdanie[start:start+index].isalpha()}")
#     start += 1 + index  # żeby ominąć tę spację +1

# print(f"\n\n{"*"*20}\nIlość słow w zdaniu: {ilosc_slow}")

# ### Slowniki
# # pary klucz:wartość
# # przy dużych kolekcjach jestesmy w stanie szybko siegnac po wartosc poprzez klucz

# slownik = {
#     "klucz1": 2,
#     "klucz2": 33,
#     "klucz3": 77,
# }
# print(slownik["klucz2"])

# # moj_slownik = {
# #     "klucz1": "wartość1",
# #     "klucz2": "wartość2",
# #     "klucz3": "wartość3",
# #     "klucz4": "wartość4",
# # }

# moj_slownik2 = {
#     1: "wartość1",
#     2: "wartość2",
#     3: "wartość3",
#     4: "wartość4",
# }


# print(moj_slownik2.values())

# moj_slownik2["klucz 5"] = "kolejna wartosc"
# moj_slownik2[6] = "kolejna wartosc 6"
# print(moj_slownik2)

# # SLOWNIKI


# moj_slownik = {
#     "klucz1": "wartość1",
#     "klucz2": "wartość2",
#     "klucz3": "wartość3",
#     "klucz4": "wartość4",
#     "klucz5": [1, 2, 3],
# }


# # jak wyświetlić "wartość3"?
# moj_slownik = {
#     "klucz1": "wartość1",
#     "klucz2": "wartość2",
#     "klucz3": "wartość3",
# }

# print(moj_slownik.get("klucz3"))

# # co zwraca poniższa metoda?

# print(moj_slownik.items())
# print(moj_slownik.values())
# # zbiory z listy

# mojalista = ["a", "b", "a", "d", "e", "a"]

# zbior = set(mojalista) #=> Sposób na usuwanie duplikató z listy
# print(zbior)
# lista_ze_zbioru = list(zbior)
# print(lista_ze_zbioru)


# # jak wyświetlić literę "a" ?

# pies = {
#     1: "a",
# }
# print(pies[1])


# # czy to jest poprawne? -> Tak, słowniki mogą powtarzać wartości. to klucze mają być unikalne

# moj_slownik2 = {
#     "a": "1",
#     "b": "1",
# }

# # czy to jest poprawne? jaki będzie wynik? -> przechodzi. traktuje jakby przecinka nie było

# moj_slownik3 = {
#     "a": "2",
# }
# print(moj_slownik3)

# # czy to jest poprawne?-> Nie, nie możeny używać "+" do słowników
# moj_slownik2 = {
#     "a": "1",
#     "b": "1",
# }
# print(moj_slownik2)

# moj_slownik3 = {
#     "c": "3",
#     "d": "4",
# }
# slowniki_razem = moj_slownik2 + moj_slownik3

# # czy to jest poprawne? -> tak

# moj_slownik2 = {
#     "a": "1",
#     "b": "1",
# }

# moj_slownik3 = {
#     "c": "3",
#     "d": "4",
# }

# moj_slownik2.update(moj_slownik3)
# print(moj_slownik2)
# print(moj_slownik3)

# # czym sie rozni update od | lub {**dict1, **dict2}? ->  Niczym w wyniku

# moj_slownik2.update(moj_slownik3)
# print("update ", moj_slownik2)

# print("moj_slownik2 | moj_slownik3", moj_slownik2 | moj_slownik3)
# print("**dict1, **dict2}", {*moj_slownik2, *moj_slownik3}) #-> liczba gwiazdek to liczba elementów


# # Struktury mieszane:
# przepis = {"jajecznica": ["jajka","sól","pieprz"], "zupa": ["woda", "kość"]}