Zajęcia 4 - Struktury danych, metody
Struktury danych takie jak lista czy krotki (list and tuple) umożliwiają przechowywanie i manipulacje danymi.
Listy
Listy składają się z elementów oddzielonych od siebie przecinkami i umieszczonych w nawiasach kwadratowych. Elementy zawierające się w liście mogą mieć różne typy.
my_list = [1, 2, 3, 4, 5]
Elementy w liście posiadają indeksy. Należy pamiętać, że indeksy w Pythonie liczone są od 0 !
my_list[0] # returns first element - 1
my_list[4] # returns fifth element - 5
my_list[-1] # returns last element - 5
Listy mogą też być cięte (sliced). Wszystkie operacje wycinania zwracają nową listę zawierającą żądane elementy. Oznacza to, że poniższy fragment kodu zwraca płytką kopię listy.
my_list[0:3] # gives first, second and third element of te list
my_list[2:] # returns from second to the last element of the list
my_list[-3:] # return third element from the end to the last
print(f"oryginalna lista: {my_list}") # returns [1, 2, 3, 4, 5]
new_list = my_list[1:3]
print(f"pocięta lista: {new_list}") #returns [[2, 3]
print(f"oryginalna lista2: {my_list}") # returns [1, 2, 3, 4, 5]
Listy można ze sobą łączyć:
my_list + [6, 7, 8] # returns [1, 2, 3, 4, 5, 6, 7, 8]
Istnieje możliwość zmiany zawartości listy - oznacza to że są mutowalne (mutable):
my_list[2] = 9 # returns [1, 2, 9, 4, 5]
Przypisanie do wycinków jest również możliwe, i może to nawet zmienić rozmiar listy lub całkowicie ją wyczyścić.
my_list[2:4] = [6, 7, 8] # returns [1, 2, 6, 7, 8, 5]
my_list[:] = [] #reurns []
Ważne, żeby zapamiętać, że proste przypisanie w Pythonie nigdy nie kopiuje danych. Gdy lista zostanie przypisana do zmiennej, zmienna odnosi się do istniejącej listy. Wszelkie zmiany, które zostaną wprowadzone w liście za pomocą jednej zmiennej, będą widoczne przez wszystkie inne zmienne, które się do niej odnoszą.
Często używaną i przydatną funkcją jest funkcja len() - zwraca ona długość tablicy:
len(my_list) #returns 5
Przykładowe metody list
Metoda | Opis |
---|---|
.append(x) | Dodaje x na końcu listy. |
.extend([x]) | Umożliwia rozszerzenie listy o inną listę (dodaje wiele elementów na raz) |
.insert(i, x) | Wstawia element x na podaną pozycję przed indeksem i. |
.remove(x) | Usuwa pierwszy znaleziony element z listy, który jest równy x Jeśli nie znajdzie żadnego x zwraca ValueError. |
.pop([i]) | Usuwa element na określonej w argumencie pozycji i zwraca go |
.clear() | Usuwa wszystkie elementy listy |
.index(x) | Zwraca indeks pierwszego elementu, który jest równy x |
.count(x) | Zwraca liczbę ile razy x wystąpiło w liście |
.sort(*, key = Nonse, reverse = false) | Sortuje elementy listy bez tworzenia jej kopii |
.reverse() | Odwraca kolejność elementów bez tworzenia kopii listy |
.copy() | Zwraca "shallow copy" listy |
Krotki (tuple)
Krotki w Pythonie to rodzaj struktury danych podobnej do list, ale z jedną kluczową różnicą: krotki są niemutowalne, co oznacza, że raz utworzone, nie można ich zmieniać.
Kilka kluczowych cech krotek:
- Niemutowalne: Po utworzeniu krotki nie można zmieniać jej zawartości — nie można dodawać, usuwać ani modyfikować elementów.
- Tworzenie krotek:
- Pustą krotkę tworzy się za pomocą nawiasów:
()
. - Krotkę z jednym elementem tworzy się dodając przecinek po elemencie:
a,
lub(a,)
. - Krotki z wieloma elementami można tworzyć, oddzielając elementy przecinkami:
a, b, c
lub(a, b, c)
. - Używając
tuple()
- Wygodna do przechowywania stałych danych: Krotki są często używane do przechowywania danych, które nie powinny się zmieniać, takich jak współrzędne punktu (x, y), daty, czy wartości zwracane przez funkcję.
- Szybsze niż listy: Ponieważ krotki są niemutowalne, operacje na nich mogą być szybsze niż na listach.
- Mogą zawierać różne typy danych: Krotki mogą przechowywać różne typy danych (np. liczby, stringi, inne krotki), co czyni je użytecznymi do przechowywania zróżnicowanych informacji. - ciekawe jest że w krotce można przechowywać mutowalne elementy
Przykładowe metody:
Metoda | Opis |
---|---|
.index(x) | Zwraca indeks pierwszego elementu, który jest równy x |
.count(x) | Zwraca liczbę ile razy x wystąpiło w liście |
Sets
To nieuporządkowana kolekcja bez elementów powtarzających się. Podstawowe zastosowania obejmują testowanie przynależności i eliminowanie duplikatów. Obiekty zbiorów obsługują także operacje matematyczne, takie jak suma, przecięcie, różnica i różnica symetryczna.
Do tworzenia setów używa się nawiasów klamrowych {}
bądź funkcji set()
numbers = {1, 1, 2, 3, 4, 4, 4, 5, 6}
print(numbers) # {1, 2, 3, 3, 5, 6}
a = set('abracadabra')
b = set('alacazam')
a # unique letters in a
{'a', 'r', 'b', 'c', 'd'}
a - b # letters in a but not in b
{'r', 'd', 'b'}
a | b # letters in a or b or both
{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
a & b # letters in both a and b
{'a', 'c'}
a ^ b # letters in a or b but not both
{'r', 'd', 'b', 'm', 'z', 'l'}
Słownik
Słowniki w Pythonie to jedna z podstawowych struktur danych, która pozwala na przechowywanie par klucz-wartość. Oto kluczowe cechy i zastosowania słowników:
Cechy słowników:
- Nieuprządkowana kolekcja: Słowniki są nieuporządkowane, co oznacza, że nie zapisują kolejności, w jakiej elementy zostały dodane.
- Unikalne klucze: Każdy klucz w słowniku musi być unikalny. Jeśli spróbujesz dodać nowy element z kluczem, który już istnieje, wartość dla tego klucza zostanie zaktualizowana.
- Haszowalne klucze: Klucze muszą być haszowalne, co oznacza, że muszą być typu niezmienniczego (immutable). Typowe przykłady to liczby, napisy (strings), krotki (tuples) zawierające tylko niemutowalne elementy. Listy, słowniki i inne zbiory nie mogą być używane jako klucze, ponieważ są mutowalne.
- Mutowalne wartości: Wartości w słownikach mogą być dowolnego typu i są mutowalne. Możesz przechowywać w słowniku liczby, napisy, listy, inne słowniki itp.
Tworzenie słowników:
- Przez użycie nawiasów klamrowych
- Przez użycie funkcji dict()
- Przez konwersję z listy krotek:
my_dict = dict([('name', 'Alice'), ('age', 30), ('city', 'New York')])
Operacje na słownikach:
- dodawanie i aktualizowanie elementów:
my_dict["name"] = "natalia" #dodaje nowy element z kluczem "name" i wartością "natalia"
- usuwanie elementów
del my_dict["name"]
name = my_dict.pop("name") # usuwa klucz i zwraca jego wartość
last_item = my_dict.popitem() # usuwa ostatni dodany element i zwraca go jako krotkę
- sprawdzenie istnienia klucza
if "name" in my_dict:
print("klucz istnieje"
- iterowanie po kluczach i wartościach
for key in my_dict:
print(key, my_dict[key]
for key, value in my_dict.items()
print(key, value)
- odczytywanie wartości
name = my_dict.get("name")