Iterowanie po listach w Pythonie — range, enumerate, zip
Tu rozwinę i wyjaśnię dokładniej, jak można przechodzić po elementach listy w Pythonie, gdy jednocześnie potrzebujesz indeksów albo chcesz łączyć dwie listy. Materiał ten rozszerza lekcję o iterowaniu z indeksem i równoległych pętlach oraz zawiera wskazówki dotyczące pętli i podstaw pętli w Pythonie.
Co warto zapamiętać (szybkie przypomnienie)
- range(start, stop, step) — tworzy sekwencję liczb, gdzie
startjest włączający, astopjest wyłączający (nie jest zawarty). Parametrstepto krok między liczbami. - enumerate(lista, start=0) — zwraca pary (index, wartość). Możesz ustawić od którego indeksu liczyć przez
start. - zip(a, b, ...) — łączy elementy z kilku list w pary (lub krotki). Iteracja odbywa się do długości najkrótszej z list.
Szczegółowe wyjaśnienie i krótkie przykłady
1) range(start, stop, step)
Jak działa:
- Jeśli podasz tylko jeden argument, to będzie to
stopi sekwencja zacznie się od 0:range(5)→ 0, 1, 2, 3, 4. - Jeśli podasz
startistop, liczby będą odstartdostop - 1:range(1, 5)→ 1, 2, 3, 4. - Argument
steppozwala ustawić skok między elementami:range(0, 10, 3)→ 0, 3, 6, 9.
Krótki przykład (pokazuję tylko strukturę, nie rozwiązanie zadania domowego):
for i in range(0, 10, 3):
print(i) # wypisze: 0, 3, 6, 9
Uwaga praktyczna: gdy chcesz wypisać liczby parzyste w pewnym przedziale, użyj odpowiedniego start i step. Pamiętaj, że wartość stop nie zostanie wydrukowana, jeśli jest równa tej granicy (zakres jest wyłączający).
2) enumerate(lista, start=0)
Gdy potrzebujesz numerów porządkowych przy przechodzeniu po elementach listy, zamiast robić liczniki ręcznie, użyj enumerate.
Przykład (liczmy od 1, żeby numeracja była bardziej przyjazna dla człowieka):
imiona = ["Ania", "Bartek", "Celina"]
for i, name in enumerate(imiona, start=1):
print(i, name) # Wynik:
# 1 Ania
# 2 Bartek
# 3 Celina
Krok po kroku:
enumerate(imiona)tworzy iterator, który w każdej iteracji daje krotkę (index, wartość).- W pętli przypisujemy te dwie wartości do zmiennych
iiname. - Dzięki
start=1indeksacja rozpoczyna się od 1 zamiast od 0.
3) zip(a, b, ...)
zip łączy elementy z kilku sekwencji „po kolei” i zwraca iterator z krotkami. Jeśli listy mają różne długości, zip zakończy się na długości najkrótszej listy.
Przykład:
imiona = ["Ania", "Bartek", "Celina"]
punkty = [85, 92, 78]
for name, score in zip(imiona, punkty):
print(name, "ma", score, "punktów") # Wynik:
# Ania ma 85 punktów
# Bartek ma 92 punktów
# Celina ma 78 punktów
Wskazówka: jeśli chcesz sprawdzić, co dokładnie zwróci zip, możesz skonwertować jego wynik na listę: list(zip(a, b)) — wtedy zobaczysz wszystkie pary od razu.
Łączenie enumerate i zip
Możesz razem użyć enumerate i zip, np. gdy chcesz numerować pary elementów:
for idx, (name, score) in enumerate(zip(imiona, punkty), start=1):
print(idx, name, score)
Uwaga o bezpieczeństwie danych i sytuacjach specjalnych
- Jeśli listy różnią się długością i chcesz uwzględnić wszystkie elementy, rozważ użycie
itertools.zip_longest(import z modułuitertools), który wypełnia brakujące wartości wartością domyślną. - Jeżeli używasz indeksów ręcznie (np.
for i in range(len(lista))), pamiętaj oIndexError— sprawdzaj długości list, gdy operujesz równolegle na kilku listach.
Ćwiczenie (zadanie do samodzielnego rozwiązania)
- Użyj
range, aby wypisać liczby parzyste od 2 do 10 (włącznie). Podpowiedź: dostosujstart,stopistep; pamiętaj, żestopnie jest zawarty w zakresie. - Stwórz dwie listy (np. lista produktów i lista cen) i wypisz każdą parę produkt — cena w czytelnej formie. Podpowiedź: użyj
zip. Jeśli listy mają różną liczbę elementów, pomyśl, czy chcesz pominąć nadmiarowe elementy, czy raczej je wypełnić (np. zerem lub napisem "brak").
Jeśli utkniesz, spróbuj najpierw wypisać wynik list(range(...)) lub list(zip(...)), żeby zobaczyć, co dokładnie otrzymujesz — to pomaga zrozumieć, co robi Twój kod.
Ta rozszerzona lekcja bazuje na materiałach dotyczących iterowania z indeksem oraz używania range, enumerate i zip w pętlach oraz na szerszym omówieniu pętli w Pythonie.