Struktury danych
Struktury danych
- służą do organizowania i przechowywania danych
- jest ich wiele rodzajów. Wybierane są pod kątem konkretnego zastosowania - czy do danego celu dana struktura będzie efektywna i czy umożliwi korzystanie z danych w sposób nie zaskakujący odbiorców (programistów)
- sama w sobie struktura niesie ze sobą znaczenie i spełnia pewne oczekiwania np. wybierając w Pythonie listę programista wie, że może ją modyfikować i że powiązane są z nią pewne metody służące do jej obsługi
Listy i krotki
W obu wypadkach:
- każdy element ma swój indeks umożliwiający jego szybkie odnalezienie
- obie mogą posiadać duplikaty
- w obu wypadkach można się przemieszczać (iterate) po ich elementach
ALE...
Listy
- są modyfikowalne (mutable) tzn. można do nich dodawać / odejmować nowe elementy
- bardzo często przemieszczamy się w ich wypadku po elementach
- raczej unika się sięgania po elementy umieszczone gdzieś w środku list
- dobrą analogią mogą być książki na półce
- deklaruje się je poprzez użycie nawiasów kwadratowych
[]
np.
moje_ksiazki = ["Blade Runner", "Hobbit", "Unicorn Project"]
Krotki
- są niemodyfikowalne (immutable)
- ponieważ ich długość jest stała częściej sięgamy po elementy znajdujące się gdzieś głęboko w nich
- dobrym przykładem mogą być np. kategorie w menu restauracji
- deklaruje się je poprzez użycie nawiasów okrągłych
()
np.
menu_kategorie = ("przystawki", "zupy", "desery")
Indeksy
Chcąc "wyciągnąć" konkretny element będący ich częścią wpisujemy identyfikator w nawiasach kwadratowych po nazwie zmiennej .
nazwa_zmiennej[indeks]
np.
moja_lista = ["cos1", "cos2", "cos3", "cos4" ]
print(moja_lista[2])
WAŻNE!!! Indeksy są liczone od 0 nie od 1 . Stąd też pierwszy element na powyższej liście ma indeks 0, ostatni 3.
Możliwe jest też sięgnięcie "wstecz" np. ostatni element można wskazać przez użycie indeksu -1.
"Cięcie" list i krotek
Chcąc wyświetlić zakres elementów listy / krotki należy wpisać w nawiasie kwadratowym element startowy i element końcowy oddzielone dwukropkiem.
moja_zmienna[start:koniec]
np.
print(moja_lista[1:3])
Metody dla list i krotek
Metody to specjalne funkcje "wbudowane" w dany obiekt. Wywołuje się je poprzez wpisanie nazwy zmiennej, postawienie kropki i wstawienie parametrów do metody w nawiasach okrągłych (jeśli nie przekazujemy żadnych zostawiamy same nawiasy okrągłe).
krotka | lista | opis |
---|---|---|
.count() | .count() | zlicza ilość wystąpień przekazanego parametru |
.index() | .index() | podaje pierwszy indeks pod którym jest przekazana wartość |
.append() | dodaj argument do listy | |
.pop() | usuń element o podanym indeksie z listy(lub ostatni element) | |
.sort() | sortuje elementy | |
.copy() | zwraca kopię obiektu |
Słowniki i zbiory
Zarówno słowniki jak i zbiory przechowują "klucze", które nie mogą się powtarzać. Jednak w przypadku słowników z kluczem jest powiązana wartość.
Klucze muszą być wartością na której da się wykonać tzw. funkcję skrótu (są "hashable"). W tym wypadku chodzi o to, że muszą to być obiekty, które nie są modyfikowalne (np. ciągi znaków, liczby).
Słowniki
Umożliwiają szybkie odnalezienie jakiejś zawartości z pomocą wartości klucza przypisanego do niej.
Deklarujemy je poprzez użycie nawiasów klamrowych, a w nich pary klucz, wartość rozdzielonych dwukropkiem.
**moj_slownik={klucz:wartość}
**
np.
menu ={
"zupa" : "ogórkowa",
"lody" : "waniliowe",
"sok" : "pomarańczowy"
}
Chcąc wyświetlić wartość przechowywaną pod konkretnym kluczem działamy podobnie jak z listą.
Różnica polega na tym, że w nawiasach kwadratowych podajemy nie indeks, tylko klucz np.
print(menu["zupa"])
Jeśli kluczem jest np. jakiś tekst będący nazwą potrawy a wartością lista zawierająca jej składniki to trzymamy się tego przez cały słownik.
Przy konstruowaniu słownika warto być konsekwentnym - nie wrzucamy jako kolejnego elementu np. klucza z jakąś liczbą (niech to będzie chociażby numer strony naszej ulubionej książki kucharskiej) zestawionego z krotką przechowującą kaloryczność składników jako wartość.
Zwracajmy też uwagę na to czy faktycznie w naszym programie korzystamy z tych słownikowych kluczy - jeśli nie, to jest spora szansa, że powinniśmy skorzystać z innej struktury danych.
Słowniki - metody
słownik | opis |
---|---|
.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 klucz:wartość |
.get() | zwraca wartość dla danego klucza |
Zbiory
Wyglądają podobnie do listy. Mają jednak jedną cenną cechę:
nie posiadają duplikatów wartości.
Czyli jeśli dwa razy spróbujemy do zbioru dodać np. słowo "kot" to ten drugi wpis zostanie usunięty.
Nie mają też indeksów (!).
Bezpiecznie jest myśleć o nich jako o takich dziwnych słownikach, które mają jedynie klucze.
Pewnie dlatego też, podobnie jak słowniki, deklaruje się je z użyciem nawiasów klamrowych:
moj_zbior={unikat1, unikat2, unikat3}
Właśnie ten brak powtórzeń jest często wykorzystywany - np. zamieniamy listę na zbiór żeby pozbyć się duplikatów.
Odnośniki
„3.12.5 Documentation”. Dostęp 18 sierpień 2024. https://docs.python.org/3/.
Viafore, Patrick. Robust Python: write clean and maintainable code. First edition. Beijing [China]; Boston [MA]: O’Reilly, 2021.