Listy w Pythonie - Niezbędne Operacje na Maturze
Listy w Pythonie to absolutnie najważniejsza struktura danych, jakiej będziesz używać na maturze. Pomyśl o liście jak o uniwersalnym 'pudełku' lub 'segregatorze', do którego możesz wkładać dane (liczby, napisy) w określonej kolejności. Co najważniejsze, możesz je później łatwo przeglądać, dodawać nowe, usuwać, modyfikować i sortować. W Pythonie lista jest dynamiczna, co oznacza, że sama 'rośnie' i 'maleje', kiedy dodajesz (append) lub usuwasz z niej elementy. Nie musisz z góry deklarować jej rozmiaru, co jest niezwykle wygodne. Każde zadanie maturalne, w którym wczytujesz dane z pliku tekstowego (np. 1000 liczb), będzie wymagało od Ciebie stworzenia listy i wczytania tych danych do niej w celu dalszej analizy.
Dlaczego to ważne? Bez list nie rozwiążesz praktycznie żadnego zadania programistycznego na maturze. Służą do przechowywania wszystkich wczytanych danych z pliku, co pozwala na ich wielokrotną analizę (np. znalezienie min/max, sortowanie, szukanie sąsiadów). To Twoje podstawowe narzędzie pracy.
Teoria
Lista (list) w Pythonie to uporządkowana, mutowalna (zmienna) kolekcja obiektów. 'Uporządkowana' oznacza, że elementy mają stałą kolejność. 'Mutowalna' oznacza, że możesz zmieniać jej zawartość (dodawać, usuwać, modyfikować elementy) po jej utworzeniu. Dostęp do elementów odbywa się poprzez indeksy (numery pozycji), liczone zawsze od zera.
Jak to działa?
- Tworzenie: Pustą listę tworzysz przez
nazwa = []lubnazwa = list(). - Dodawanie na koniec: Używasz metody
.append(element). To najczęstsza operacja przy wczytywaniu plików. - Indeksowanie (od 0!):
lista[0]to pierwszy element.lista[1]to drugi. - Ostatni element:
lista[-1](bardzo przydatny skrót) lublista[len(lista) - 1]. - Modyfikacja: Po prostu przypisujesz nową wartość do indeksu:
lista[0] = 100. - Długość: Funkcja
len(lista)zwraca liczbę elementów w liście. - Cięcie (Slicing):
lista[a:b]wycina fragment od indeksuadob-1.
Złożoność: Złożoność czasowa: Dostęp/modyfikacja elementu po indeksie (lista[i]) -> O(1). Dodanie na koniec (.append()) -> O(1) (amortyzowane). Sprawdzenie długości (len()) -> O(1). Przeszukanie listy (x in lista) -> O(n). Sortowanie (.sort()) -> O(n log n).
Implementacja
Tworzenie, append() i dostęp po indeksie
Python# 1. Tworzenie i dodawanie elementów
liczby = []
liczby.append(10)
liczby.append(20)
liczby.append(30)
print(f"Lista: {liczby}") # [10, 20, 30]
# 2. Dostęp po indeksie (od 0!)
print(f"Pierwszy element: {liczby[0]}") # 10
print(f"Drugi element: {liczby[1]}") # 20
# 3. Modyfikacja elementu
liczby[1] = 99
print(f"Zmieniona lista: {liczby}") # [10, 99, 30]
# 4. Długość listy
print(f"Długość listy: {len(liczby)}") # 3
# 5. Ostatni element
print(f"Ostatni element: {liczby[-1]}") # 30To są absolutne podstawy. Tworzysz pustą listę `[]`, dodajesz na koniec `.append()`, odczytujesz `[indeks]` i zmieniasz `[indeks] = nowa_wartosc`. `len()` i `[-1]` to funkcje, których będziesz używać cały czas.
Iterowanie (pętle) po liście
Pythondane = [5, 10, 15, 20]
# Sposób 1: Iteracja po WARTOŚCIACH (gdy nie potrzebujesz indeksu)
# Najprostszy i najbardziej 'pythonowy'
print("Iteracja po wartościach:")
for element in dane:
print(element * 2)
# Sposób 2: Iteracja po INDEKSACH (gdy musisz znać pozycję 'i')
# Niezbędne do analizy sąsiadów (np. dane[i] i dane[i+1])
print("\nIteracja po indeksach:")
for i in range(len(dane)):
print(f"Indeks {i}, Wartość {dane[i]}")Masz dwa sposoby na pętlę. `for element in lista:` jest prostszy i lepszy, jeśli chcesz tylko przetworzyć każdą wartość. `for i in range(len(lista)):` jest konieczny, jeśli musisz odwołać się do konkretnego indeksu, np. aby porównać `dane[i]` z `dane[i-1]`.
Cięcie (Slicing) - potężne narzędzie
Pythonlitery = ['a', 'b', 'c', 'd', 'e', 'f']
# Cięcie [start:stop] (stop nie jest wliczany)
print(litery[1:4]) # ['b', 'c', 'd'] (indeksy 1, 2, 3)
# Od początku do indeksu 3 (bez 3)
print(litery[:3]) # ['a', 'b', 'c']
# Od indeksu 2 do samego końca
print(litery[2:]) # ['c', 'd', 'e', 'f']
# Tworzenie KOPII listy (BARDZO WAŻNE)
kopia_listy = litery[:] # To jest nowa, niezależna lista
# Odwracanie listy
odwrocona = litery[::-1]
print(f"Odwrocona: {odwrocona}") # ['f', 'e', 'd', 'c', 'b', 'a']Cięcie (slicing) pozwala wycinać fragmenty listy. `lista[:]` to najprostszy sposób na stworzenie *prawdziwej kopii* listy. `lista[::-1]` to magiczny skrót na odwrócenie listy, bardzo przydatny np. przy palindromach.
Ważne metody: .sort(), .pop(), .remove()
Pythonliczby = [40, 10, 30, 20]
# 1. .sort() - sortuje listę W MIEJSCU (nic nie zwraca!)
liczby.sort() # Sortuje rosnąco
print(f"Posortowana: {liczby}") # [10, 20, 30, 40]
liczby.sort(reverse=True) # Sortuje malejąco
print(f"Malejąco: {liczby}") # [40, 30, 20, 10]
# 2. .remove(wartosc) - usuwa PIERWSZE wystąpienie danej WARTOŚCI
liczby.remove(30)
print(f"Po remove(30): {liczby}") # [40, 20, 10]
# 3. .pop(indeks) - usuwa element o danym INDEKSIE (i go zwraca)
element = liczby.pop(1) # Usuń element o indeksie 1
print(f"Usunięto: {element}") # 20
print(f"Po pop(1): {liczby}") # [40, 10]`.sort()` to najważniejsza metoda sortująca, modyfikuje listę na stałe. `.remove()` usuwa po wartości, a `.pop()` usuwa po indeksie. Uważaj na `.sort()` - ono nic nie zwraca (błędem jest `nowa_lista = lista.sort()`).
Przykładowe Zadania Maturalne
W pliku 'temperatury.txt' znajduje się 365 liczb (każda w nowej linii), oznaczających średnią temperaturę w kolejnych dniach roku. Wczytaj wszystkie dane do listy. Następnie znajdź i wypisz najwyższą oraz najniższą zanotowaną temperaturę.
Wskazówka: Wczytaj wszystkie temperatury z pliku do listy używając pętli FOR i metody .append(). Po wczytaniu całej listy, możesz użyć wbudowanych funkcji min(lista) oraz max(lista).
Pokaż szkic rozwiązania
1. Stwórz pustą listę: `temperatury = []`. 2. Otwórz plik 'temperatury.txt' do odczytu. 3. W pętli `for linia in plik:`: a. `temp = float(linia.strip())` (lub int, zależnie od danych). b. `temperatury.append(temp)`. 4. Po pętli (gdy wszystkie dane są w liście): 5. Oblicz min i max: `min_temp = min(temperatury)` i `max_temp = max(temperatury)`. 6. Wypisz `min_temp` i `max_temp`.
W pliku liczby.txt w pierwszym wierszu znajduje się 3000 liczb pierwszych. Napisz program, który spośród liczb z pierwszego wiersza poda liczbę, która jest sto pierwszą liczbą w kolejności, licząc od największej po ich uporządkowaniu.
Wskazówka: To zadanie idealnie pokazuje potęgę list. Wczytaj wszystkie 3000 liczb z pierwszego wiersza do jednej listy. Następnie użyj metody .sort(reverse=True), aby posortować ją malejąco. 'Sto pierwsza' liczba będzie miała indeks 100 (bo liczymy od 0).
Pokaż szkic rozwiązania
1. Otwórz plik 'liczby.txt'. 2. Wczytaj *tylko pierwszy wiersz*: `pierwszy_wiersz = plik.readline()`. 3. Utwórz listę liczb z tego wiersza: a. `stringi_liczb = pierwszy_wiersz.split()`. b. `liczby = []`. c. `for s in stringi_liczb: liczby.append(int(s))`. d. (Szybciej: `liczby = [int(s) for s in pierwszy_wiersz.split()]`). 4. Posortuj listę malejąco: `liczby.sort(reverse=True)`. 5. 'Sto pierwsza' liczba jest na pozycji 100 (indeksy: 0, 1, 2... 100). 6. Wypisz: `print(liczby[100])`.
Częste Błędy
❌ Błąd IndexError: list index out of range
Najczęstszy błąd. Próbujesz odwołać się do indeksu, który nie istnieje, np. lista[5] w liście, która ma tylko 3 elementy (indeksy 0, 1, 2). Często zdarza się przy pętlach for i in range(len(lista)) i sprawdzaniu lista[i+1].
Poprawka: Pamiętaj, że ostatni indeks to len(lista) - 1. Jeśli pętla sprawdza lista[i+1], musi się kończyć na range(len(lista) - 1).
❌ nowa_lista = lista.sort()
Metoda .sort() modyfikuje listę 'w miejscu' i nic nie zwraca (zwraca None). Pisząc tak, nowa_lista staje się None, a Ty tracisz swoje dane.
Poprawka: Rób to w dwóch krokach: liczby.sort() (ta linia modyfikuje liczby), a potem print(liczby). Jeśli chcesz nową, posortowaną listę, użyj funkcji nowa_lista = sorted(liczby).
❌ Tworzenie 'kopii' przez lista2 = lista1
To nie tworzy kopii! Obie zmienne (lista1 i lista2) wskazują na ten sam obiekt w pamięci. Zmiana w lista2 magicznie zmienia też lista1.
Poprawka: Aby stworzyć prawdziwą, niezależną kopię, użyj slicingu: lista2 = lista1[:] lub metody .copy(): lista2 = lista1.copy().
❌ Modyfikowanie listy podczas iteracji po niej
Bardzo niebezpieczne. Piszesz for element in lista: if element < 0: lista.remove(element). To psuje pętlę, bo 'gubi' ona indeksy. Pętla for przeskakuje elementy.
Poprawka: Nigdy nie modyfikuj listy, po której iterujesz. Zamiast tego iteruj po kopii (for element in lista[:]) albo stwórz nową, pustą listę i dodawaj do niej tylko te elementy, które chcesz zachować.
Kluczowe Wnioski
- Listy w Pythonie są mutowalne (można je zmieniać) i dynamiczne (same rosną).
- Indeksowanie ZAWSZE zaczyna się od
0. Ostatni element tolista[-1]. - Do dodawania na koniec służy
.append(element). - Do wczytania danych z pliku: stwórz pustą listę
[]i użyj pętliforz.append(). - Do sortowania w miejscu użyj
.sort(). Do stworzenia nowej posortowanej kopii użyjnowa = sorted(stara). - Aby skopiować listę, użyj
kopia = lista[:]lubkopia = lista.copy(). - Funkcje
len(),min(),max(),sum()są twoimi najlepszymi przyjaciółmi.
Najczęściej Zadawane Pytania
❓ Jaka jest różnica między listą a krotką (tuple)?
Krotka (ang. `tuple`, np. `(1, 2)`) jest jak lista, ale jest *niemutowalna* (niezmienna). Po stworzeniu krotki nie możesz zmienić jej elementów, dodać ani usunąć. Listy (`[]`) są w pełni edytowalne. Na maturze 99% czasu będziesz używać list.
❓ Jaka jest różnica między `.sort()` a `sorted()`?
`.sort()` to *metoda* listy. Modyfikuje listę 'w miejscu' i nic nie zwraca (zwraca `None`). `sorted()` to *funkcja*. Przyjmuje listę jako argument, *zwraca nową*, posortowaną listę i *nie zmienia* oryginału.
❓ Jak szybko sprawdzić, czy element jest w liście?
Użyj operatora `in`. Jest to bardzo czytelne: `if 5 in moja_lista: print("Znaleziono!")`. Pamiętaj tylko, że ma to złożoność O(n) (musi przejrzeć listę).
❓ Jak połączyć dwie listy?
Użyj operatora `+`. `lista3 = lista1 + lista2`. To tworzy nową, trzecią listę. Jeśli chcesz dodać elementy `listy2` na koniec `listy1` (modyfikując `lista1`), użyj `lista1.extend(lista2)`.
❓
Chcesz opanować wszystkie tematy maturalne?
Dołącz do kursu i zyskaj dostęp do interaktywnych lekcji, edytora kodu i setek zadań.