Struktury danych w Pythonie #1. Listy i krotki

Czym jest lista albo zbiór? Myślę, że te pojęcia nie są Ci obce, nawet jeśli nie kojarzą Ci się z programowaniem. Lista to elementy zapisane w pewnej kolejności, a zbiór to kolekcja niepowtarzających się elementów. 

Tworzysz czasami jakieś listy? Listę zakupów, listy todo, … ?

Pewnie widzisz jak często przydają się w życiu codziennym, a w programowaniu spotkasz je na każdym kroku! 

CZYM SĄ STRUKTURY DANYCH?

Struktury danych służą uporządkowaniu danych, pozwalają na wykonywanie na nich operacji m. in. wyszukiwania, porównywania, filtrowania czy sortowania. W kolejnych artykułach poznasz struktury danych używane w Pythonie: listy, tuple, słowniki i zbiory. 

CZYM JEST LISTA?

Wyobraź sobie parking. Co widzisz?

Każdy samochód stoi na konkretnym miejscu, możemy zauważyć kilka takich samych aut. Samochody przyjeżdzają i odjeżdzają, zmieniając “układ” parkingu.

Chciałabym zgromadzić dane na temat samochodów parkujących na tym parkingu. Hmm, jestem ciekawa, jakich będzie najwięcej 🤔.

Co mogę zrobić?

Stworzyć listę!

Listystrukturą pozwalającą na przechowywanie elementów w sposób uporządkowany.

>>> cars = ['Maluch', 'Garbus', 'Audi', 'Garbus'] 

Każdy element w liście ma przyporządkowany numer – indeks, dzieki któremu jesteś w stanie dostać się do konkretnego elementu. Numery indeksów zaczynają się od zera! Aby pobrać element pierwszy, odwołaj się do indeksu 0.

Mając tę wiedzę, spróbujmy sprawdzić co mamy na pierwszym i drugim miejscu w liście carsAby pobrać element z listy, odwołaj się do konkretnego indeksu, umieszczając go w nawiasach kwadratowych.

>>> cars[0] 
'Maluch'
>>> cars[1]
'Garbus' 

Jeśli odwołasz się do nieistniejącego indeksu (w tym przypadku np. indeks 4) otrzymasz błąd IndexError.

>>> cars[3] # 
'Garbus'
>>> cars[4] 
IndexError: list index out of range
 

Od tyłu

W Pythonie możesz odwołać się do elementów również za pomocą odwrotnych indeksów.

>>> cars[3] 
'Garbus'
>>> cars[-1] # -1 - ostatni element
'Garbus' 

Różne typy danych

W Pythonie lista może zawierać elementy o różnych typach danych: string, bool, float itp.

>>> elements = [1, 'Garbus', True, 1.5] 

Cechy listy

Lista jest strukturą pozwalającą na przechowywanie elementów w sposób uporządkowany i posiada następujące cechy:

  • przechowuje elementy;
  • zachowuje kolejność (indeksy 0,1,2 …);
  • elementy mogą się powtarzać;
  • jedna lista może zawierać zmienne różnych typów;

OPERACJE NA LISTACH

Tworzenie listy

Listę w Pythonie możesz stworzyć na dwa sposoby – umieścić poszczególne elementy w nawiasach kwadratowych [] lub użyć funkcji list().
# Utworzenie pustej listy
>>> cars = [] # sposób nr 1
>>> cars
[]
>>> cars = list() # sposób nr 2
>>> cars
[]

# Utworzenie listy z elementami
>>> cars = ['Ferrari', 'Lamborghini', 'Porsche']
>>> vehicles = ['bike', 'scooter', 'bike']  
>>> cars[0] # Pierwszy element 
'Ferrari'
>>> cars[-1] # Ostatni element 
'Porsche'
>>> cars[0:2] # Dane z podanego zakresu 
['Ferrari', 'Lamborghini']  

Dodawanie nowych elementów

  • na koniec listy – append():
>>> cars = ['Ferrari', 'Lamborghini', 'Porsche']
>>> cars.append('Maluch')
>>> cars
['Ferrari', 'Lamborghini', 'Porsche', 'Maluch'] 
  • w dowolne miejsce listy – insert(index, value):
>>> cars = ['Ferrari', 'Lamborghini', 'Porsche', 'Maluch']
>>> cars.insert(1, 'BMW')
>>> cars
['Ferrari', 'BMW', 'Lamborghini', 'Porsche', 'Maluch'] 
  • rozszerzenie listy o elementy z innej listy – extend():
>>> vehicles = ['bike', 'scooter', 'bike'] 
>>> cars = ['Ferrari', 'BMW', 'Lamborghini', 'Porsche', 'Maluch']

>>> vehicles.extend(cars)
>>> vehicles
['bike', 'scooter', 'bike', 'Ferrari', 'BMW', 'Lamborghini', 'Porsche', 'Maluch']
 

Łączenie list

Aby połączyć zawartość kilku list możesz użyć znaku +.

>>> vehicles = ['bike', 'scooter', 'bike'] 
>>> cars = ['Ferrari', 'BMW', 'Lamborghini']

>>> new_list = vehicles + cars
>>> new_list
['bike', 'scooter', 'bike', 'Ferrari', 'BMW', 'Lamborghini']
 
Zawartość vehicles i cars nie zmieniła się. Została utworzona nowa lista (new_list).

Modyfikacja elementów

  • zmiana jednego elementu:
>>> cars
['Ferrari', 'BMW', 'Lamborghini', 'Porsche', 'Maluch']

# nadpisanie elementu o indeksie 0
>>> cars[0] = 'Audi'
>>> cars
['Audi', 'BMW', 'Lamborghini', 'Porsche', 'Maluch'] 
  • zmiana zakresu elementów:
>>> cars
['Audi', 'BMW', 'Lamborghini', 'Porsche', 'Maluch']

# nadpisanie elementów o indeksach 2 i 3
>>> cars[2:4] = ['Opel', 'Renault'] 
>>> cars
['Audi', 'BMW', 'Opel', 'Renault', 'Maluch'] 

Modyfikacja kolejności

  • odwrócenie listy – reverse():
>>> cars = ['Audi', 'Opel', 'BMW']
>>> cars.reverse()
>>> cars
['BMW', 'Opel', 'Audi'] 

Psst.. możesz też odwrócić listę za pomocą:

>>> cars = ['Audi', 'Opel', 'BMW']
>>> cars[::-1]
['BMW', 'Opel', 'Audi'] 
  • sortowanie – sort():
>>> cars = ['Audi', 'Opel', 'BMW']
>>> cars.sort()
>>> cars
['Audi', 'BMW', 'Opel'] 

Zliczanie występowania elementu

Do zliczenia występowania elementu w liście, możesz użyć funkcji – count().

>>> cars = ['Audi', 'Opel', 'BMW', 'Opel']
>>> cars.count("Opel")
2 

Wyszukiwanie

Przeszukanie listy w poszukiwaniu wystąpienia danego elementu.

>>> cars = ['Audi', 'BMW', 'Opel', 'Renault', 'Maluch']

# Znajduje indeks pierwszego elementu równego "Opel"
>>> cars.index("Opel")

# Sprawdza wystąpienie stringa w liście
>>> "Opel" in cars
True 

Usuwanie elementów listy

  • podając indeks:
>>> cars = ['Audi', 'Opel', 'BMW', 'Porsche']

>>> cars.pop() # zwraca ostatni element i usuwa go z listy
'Porsche'
>>> cars
['Audi', 'Opel', 'BMW']

>>> cars.pop(1) # zwraca element z indeksu 1 i usuwa go z listy
'Opel'
>>> cars 
['Audi', 'BMW']

>>> del cars[0]
>>> cars
['BMW'] 
  • podając konkretną wartość:
>>> vehicles = ['bike', 'scooter', 'bike']

>>> vehicles.remove('bike')
['scooter', 'bike'] 

Uwaga

W przypadku duplikatów usunięty zostanie tylko pierwszy pasujący element.

CZYM JEST KROTKA (TUPLE)?

Krotki, tak jak listy, pozwalają na przechowywanie elementów w sposób uporządkowany. Od list różnią się jednym: po utworzeniu krotki nie możemy modyfikować jej zawartości w trakcie działania aplikacji.

Każdy element w krotce ma przyporządkowany numer – indeks, dzieki któremu jesteś w stanie dostać się do konkretnego elementu.

Indeksy

Numery indeksów zaczynają się od zera! Aby pobrać element pierwszy, odwołaj się do indeksu 0.

Aby pobrać konkretny element z krotki, odwołaj się do indeksu w nawiasie kwadratowym [].

>>> weekdays = ("Poniedziałek", "Wtorek", "Środa", "Czwartek", "Piątek")

>>> weekdays[0] # Pierwszy element
"Poniedziałek"
>>> weekdays[4] # Ostatni element
"Piątek" 

Tak jak w przypadku list, w krotkach możesz odwołać się do elementów również za pomocą odwrotnych indeksów.

>>> weekdays = ("Poniedziałek", "Wtorek", "Środa", "Czwartek", "Piątek")

>>> weekdays[4] # Ostatni element
"Piątek"
>>> weekdays[-1] # Ostatni element
"Piątek" 

Na tuplach również możemy użyć slicingu, aby pobrać dane z zadanego zakresu.

>>> weekdays[0:2] 
("Poniedziałek", "Wtorek") 

Spróbujmy zmodyfikować krotkę:

>>> weekdays = ("Poniedziałek", "Wtorek", "Środa", "Czwartek", "Piątek")

>>> weekdays[0] ='Niedziela'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
 

Otrzymaliśmy informację o błędzie, krotki nie mogą być modyfikowane.

Cechy krotki

  • niemutowalność – zawartość krotki nie może zostać zmieniona;
  • dostęp do elementów za pomocą indeksów;
  • zachowują kolejność elementów;
  • możliwość duplikatów;
>>> weekdays = ("Poniedziałek", "Wtorek", "Środa", "Czwartek", "Piątek") 
  • krotka może zawierać elementy różnych typów
>>> elements = (1, 'Garbus', True, 1.5) 

OPERACJE NA KROTKACH

Tworzenie krotek

Aby stworzyć krotkę należy po podaniu nazwy zmiennej i znaku '=' wypisać wszystkie elementy oddzielając je przecinkiem lub dodatkowo opakować je w nawiasy okrągłe ().
# Utworzonie pustej krotki
>>> cars = ()
>>> cars = tuple()

# Utworzenie krotki z elementami
>>> cars = ('Ferrari', 'Lamborghini', 'Porsche')

# Utworzenie krotki bez nawiasów
>>> sweets = 'chocolate', 'biscuits' 

Tuple możesz stworzyć nawet bez nawiasów.

Pamiętaj o tym, że tuple możesz stworzyć nawet bez nawiasów. Ale jeśli Twój tuple zawiera tylko jeden element, pamiętaj o dodaniu przecinka po pierwszym elemencie.

>>> x = 1, 
>>> type(x) 
<type 'tuple'>

>>> x = 1
>>> type(x) 
<type 'int'>

>>> x = (1,)
>>> type(x) 
<type 'tuple'>

>>> x = (1)
>>> type(x) 
<type 'int'> 

Wyszukiwanie

Przeszukanie krotki w poszukiwaniu wystąpienia danego elementu.

>>> cars = ('Audi', 'BMW', 'Opel', 'Renault', 'Maluch')

# Znajduje indeks pierwszego elementu równego "Opel"
>>> cars.index("Opel")
2

# Sprawdza wystąpienie stringa w krotce
>>> "Opel" in cars
True 

Zliczenie występowania elementu

Do zliczenia występowania elementu w krotce, możesz użyć funkcji – count().

>>> cars = ('Audi', 'Opel', 'BMW', 'Opel')
>>> cars.count("Opel")
2 

LISTA A KROTKA (TUPLE)

Krotki to takie “sztywne” listy, których nie można edytować. 

Pamiętaj, że listy i krotki mają inne metody.

FUNKCJE WBUDOWANE - len, min, max

Jedną z bardzo przydatnych funkcji jest – len(), która zwraca liczbę elementów listy/krotki. Jeśli chcesz znaleźć najmniejszą lub największą wartość w swojej liście/krotce użyj odpowiedniu min() lub max().

>>> lista = [1,7,3]
>>> krotka = (1,7,3)

# Liczba elementów w liście
>>> len(lista) 
3
>>> len(krotka) 
3

# Najmniejsza liczba w liście
>>> min(lista) 
1
>>> min(krotka) 
1

# Największa liczba w liście
>>> max(lista) 
7
>>> max(krotka) 
7 

ZAGNIEŻDŻONE LISTY I KROTKI

Listy i krotki możemy dowolnie zagnieżdzać np. umieszczając listę w liście.

>>> my_list = [1, [6, 7], 3, 4]
>>> my_list[0]
1
>>> my_list[1]
[6, 7]

>>> my_tuple = (1, (6, 7), 3, 4)
>>> my_tuple[0]
1
>>> my_tuple[1]
(6,7) 

Stwórzmy listę dwuwymiarową.

>>> table = [[1,2,3], [4,5,6], [7, 8,9]]
>>> table[0]
[1, 2, 3]
>>> table[0][1]
2 

Pamiętaj, że listy i krotki mogą zawierać elementy o różnych typach.

my_list = [1, True, (1,2,3), [5, 6], 1.5] 

ĆWICZ PROGRAMOWANIE Z NAMI

Tak, wiem, dużo tej wiedzy, ale pamiętaj nie musisz znać nazw metod na pamięć. Zerknij w dokumentacje lub wpisz w wyszukiwarkę googla np. “add a new element to list python” 🙃.

Skoro już wiesz czym są listy i krokti, co powiesz na krótkie zadanka?

Zadanie 1. Listy. Stacja meteorologiczna.
Pracujesz w stacji meteorologicznej i dostałeś właśnie nowe zadanie. 
Przed Tobą lista wahań temperatury z ostatniego tygodnia: 1.5, 3, 2, 0, -1 , 1.9, 0.1 

Twoim zadaniem jest podanie następujących informacji:
a) najwyższa zanotowana temperatua
b) najniższa zanotowana temperatura
c) średnia temperatura
d) posortowana lista temperatur, od najmniejszej do największej
e) posortowana lista temperatur, od największej do najmniejszej

Napisz program, który zwróci odpowiednie dane.

Rozwiązanie: LINK

Zadanie 2. Krotki. Ceny.

Właśnie przygotowujesz raport pokazujący zmiany cen napoju Coca Cola po dodaniu nowego podatku cukrowego 🙃.

Przed: 3.69, 4.5, 3.6, 4.0, 3.99, 3.59 
Po:  4.5, 5.5, 4.69, 4.99, 4.00 

Twoim zadaniem jest podanie informacji o: 
a) najwyższej cenie po nałożeniu podatku,
b) najniższej cenie biorąc pod uwagę wszystkie ceny (przed i po),
c) średniej cenie przed podwyżką cen,
d) średniej cenie po dodaniu nowego podatku.

Napisz program, który zwróci odpowiednie dane.

Rozwiązanie: LINK

Specjalnie dla Ciebie przygotowałyśmy zadania o zróżnicowanej trudności na naszym profilu na Githubie: LINK. Zadania i ich rozwiązania zostały podzielone na odpowiednie foldery: Listy, Tuple itd. Przy każdym zadaniu znajdziesz stopień trudności.

Powodzenia w rozwiązywaniu zadań! 

Napotkałeś jakiś problem, masz pytanie? A może przydała Ci się dzisiejsza lekcja? Zostaw komentarz i podziel się z nami swoją opinią.

Miłego dnia!

0 0 vote
Article Rating
guest
1 Komentarz
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Joachim
Joachim
3 miesięcy temu

Fajny artykuł, dużo przykładów. Myślałem sobie “dobra, to czym te listy w sumie się różnią od krotek? “, a tu cyk pyk, jest eleganckie porównanie.