Как использовать функцию zip() в Python (объединить итерации)

Узнайте, как использовать функцию Python zip() для параллельного объединения нескольких итераций. Создание главного словаря, логика распаковки и обработка несоответствий длины.

Попробуйте это решение в редакторе

Обзор

При переборе наборов данных вам часто придется обрабатывать несколько связанных списков параллельно. Например, объединение списка имен пользователей со списком идентификаторов пользователей или сопоставление координат значений X и Y. Вместо вложенных циклов или доступа к элементам с использованием счетчиков индексации списка Python предоставляет элегантную функцию `zip()`.

Функция `zip(*iterables)` принимает несколько итераций в качестве аргументов и объединяет их, возвращая итератор кортежей, где i-й кортеж содержит i-й элемент из каждой входной итерации. Это позволяет вам легко обрабатывать две или более коллекций одновременно с помощью одного цикла for.

По умолчанию `zip()` прекращает объединение, когда исчерпана самая короткая входная итерация. Любые оставшиеся элементы в более длинных итерациях отбрасываются. Если вы хотите объединять элементы до тех пор, пока не будет исчерпана самая длинная итерация, заполняя пропущенные значения заполнителем, Python предоставляет `zip_longest()` в модуле `itertools` стандартной библиотеки.

Код и вывод выполнения

Этот скрипт демонстрирует параллельную итерацию списка, создание словаря с помощью zip и обработку несоответствий с помощью zip_longest.

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)
Терминальный выход
--- 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')]

Пошаговая реализация

  • Передайте несколько списков или итераций, которые вы хотите объединить, в функцию zip().
  • Распакуйте сгенерированные кортежи в операторе цикла for для чистых параллельных итераций.
  • Преобразуйте объект zip в словарь, используя dict(zip(keys_list,values_list)) для сопоставления.
  • Импортируйте itertools.zip_longest, чтобы объединить списки неравной длины без потери хвостовых значений.

Часто задаваемые вопросы

Как «разархивировать» заархивированную последовательность кортежей?

Вы можете разархивировать последовательность обратно в отдельные списки, используя оператор распаковки *: list(zip(*zipped_tuples)).

Дублирует ли zip() элементы в памяти?

Нет, zip() возвращает итератор, который возвращает элементы по требованию, что делает его чрезвычайно эффективным с точки зрения использования памяти.

Связанные темы

Рекомендуемые ресурсы Python

Расширьте свои знания с помощью соответствующих интерактивных руководств, шпаргалок и сравнений кода.