Wyjaśnienie lekcji
Po tej lekcji będziesz potrafić:
zip() bez ręcznego indeksowania.zip() zatrzymuje się na najkrótszym wejściu i co to oznacza dla brakujących danych.enumerate() i zip(), aby numerować sparowane rekordy.Czasem program otrzymuje powiązane dane w sekwencjach równoległych: jedna zawiera nazwy, a druga wartości w tej samej kolejności. zip() paruje je według pozycji. Każdą parę można rozpakować bezpośrednio w pętli for.
for item, value in zip(items, values):
...Ważne: zwykłe zip() zatrzymuje się, gdy skończy się jego najkrótsze wejście. Nie wymyśla wartości zastępczych dla brakujących wpisów. Gdy długości muszą być dokładnie równe, sprawdź je osobno przed sparowaniem; w przeciwnym razie nadmiarowe wartości są ignorowane.
Znasz już enumerate() do numerowania wartości. Otocz nim zip(), gdy potrzebujesz numeru do wyświetlenia liczonego od 1 oraz obu wartości. Rozpakowywanie krotek w Pythonie pozwala pętli czysto otrzymać wszystkie trzy.
Dla dopasowanych, unikalnych kluczy dict(zip(keys, values)) także tworzy tablicę wyszukiwania. Uwaga: zduplikowane klucze są nadpisywane przez ostatnią sparowaną wartość.
zones = ["west", "east"]
replicas = [2, 4]
for zone, count in zip(zones, replicas):
print(f"{zone}: {count} replicas")Wynik:
west: 2 replicas
east: 4 replicasKażdy krok pętli daje dopasowaną parę.
teams = ["alpha", "beta", "gamma"]
regions = ["eu", "us"]
print(list(zip(teams, regions)))Wynik:
[('alpha', 'eu'), ('beta', 'us')]gamma nie zostaje sparowane: nie ma trzeciego regionu.
services = ["cache", "api"]
ports = [6379, 8080]
for number, (service, port) in enumerate(zip(services, ports), start=1):
print(f"{number}. {service} uses {port}")Wynik:
1. cache uses 6379
2. api uses 8080Nawiasy wokół (service, port) rozpakowują parę wewnątrz ponumerowanego elementu.
features = ["search", "export"]
limits = [20, 5]
lookup = dict(zip(features, limits))
print(lookup)Wynik:
{'search': 20, 'export': 5}Przy zduplikowanych nazwach funkcji późniejszy sparowany limit zastąpiłby wcześniejszy.
| Cel | Wzorzec |
|---|---|
| Sparowanie dopasowanych wartości | zip(first, second) |
| Iteracja po parach | for left, right in zip(...): |
| Numerowanie sparowanych wartości | enumerate(zip(...), start=1) |
| Zbudowanie słownika | dict(zip(keys, values)) |
| Uniknięcie cichego braku danych | Sprawdź długości przed użyciem zip(), gdy jest to wymagane |
zip() nie jest pełnym złączeniem zewnętrznym (outer join): zatrzymuje się na najkrótszym wejściu.enumerate(zip(...)) tworzy numer i parę; rozpakuj poprawnie oba poziomy.