Jak korzystać z funkcji zip() w Pythonie (połącz elementy iterowalne)

Dowiedz się, jak używać funkcji zip() języka Python do łączenia wielu obiektów iteracyjnych równolegle. Opanuj tworzenie słowników, rozpakuj logikę i obsłuż niedopasowania długości.

Wypróbuj to rozwiązanie w Edytorze

Przegląd

Podczas iteracji po zbiorach danych często trzeba będzie przetwarzać wiele powiązanych list równolegle. Na przykład parowanie listy nazw użytkowników z listą identyfikatorów użytkowników lub dopasowanie współrzędnych wartości X i Y. Zamiast zagnieżdżonych pętli lub uzyskiwania dostępu do elementów za pomocą liczników indeksujących listy, Python udostępnia elegancką funkcję „zip()”.

Funkcja `zip(*iterables)` przyjmuje wiele obiektów iteracyjnych jako argumenty i agreguje je, zwracając iterator krotek, gdzie i-ta krotka zawiera i-ty element z każdej wejściowej iteracji. Pozwala to łatwo przeglądać dwie lub więcej kolekcji jednocześnie za pomocą pojedynczej pętli „for”.

Domyślnie `zip()` przestaje łączyć, gdy wyczerpany zostanie najkrótszy możliwy do iterowania element wejściowy. Wszelkie pozostałe elementy w dłuższych iteracjach są odrzucane. Jeśli chcesz łączyć elementy w pary aż do wyczerpania najdłuższego iterowalnego elementu, wypełniając brakujące wartości symbolem zastępczym, Python udostępnia funkcję `zip_longest()` w module `itertools` biblioteki standardowej.

Dane wyjściowe kodu i wykonania

Ten skrypt demonstruje równoległą iterację listy, tworzenie słownika przy użyciu zip i obsługę niedopasowań przy użyciu zip_longest.

zip_function.py
Spróbuj w Edytorze
from itertools import zip_longest

names = ["Alice", "Bob", "Charlie"]
scores = [85, 90, 95]

# 1. Basic Zipping in a loop
print("--- Parallel Iteration ---")
for name, score in zip(names, scores):
    print(f"{name} scored {score}")

# 2. Creating a dictionary from two lists
user_dict = dict(zip(names, scores))
print("\nCreated Dictionary:", user_dict)

# 3. Handling unequal list lengths with zip_longest
extra_names = ["Alice", "Bob", "Charlie", "David"]
short_scores = [85, 90]

# Standard zip truncates
print("\nStandard zip output:", list(zip(extra_names, short_scores)))

# zip_longest fills missing values
zipped_long = list(zip_longest(extra_names, short_scores, fillvalue="N/A"))
print("zip_longest output:", zipped_long)
Wyjście terminala
--- Parallel Iteration ---
Alice scored 85
Bob scored 90
Charlie scored 95

Created Dictionary: {'Alice': 85, 'Bob': 90, 'Charlie': 95}

Standard zip output: [('Alice', 85), ('Bob', 90)]
zip_longest output: [('Alice', 85), ('Bob', 90), ('Charlie', 'N/A'), ('David', 'N/A')]

Wdrażanie krok po kroku

  • Przekaż wiele list lub elementów iteracyjnych, które chcesz połączyć, do funkcji zip().
  • Rozpakuj wygenerowane krotki w instrukcji pętli for, aby uzyskać czyste równoległe iteracje.
  • Konwertuj obiekt zip na słownik, używając dict(zip(keys_list,value_list)) do mapowania.
  • Zaimportuj plik itertools.zip_longest, aby połączyć listy o różnej długości bez utraty wartości końcowych.

Często zadawane pytania

Jak „rozpakować” spakowaną sekwencję krotek?

Możesz rozpakować sekwencję z powrotem na osobne listy, używając operatora rozpakowywania *: list(zip(*zipped_tuples)).

Czy zip() duplikuje elementy w pamięci?

Nie, zip() zwraca iterator, który dostarcza elementy na żądanie, dzięki czemu jest niezwykle wydajny pod względem pamięci.

Powiązane tematy

Polecane zasoby Pythona

Poszerzaj swoją wiedzę dzięki powiązanym interaktywnym samouczkom, ściągawkom i porównaniom kodów.