Короткий ответ
zip() берёт элементы с одинаковыми индексами из переданных итерируемых объектов и собирает из них кортежи. Возвращается объект zip — итератор, который создаётся лениво, поэтому результат обычно преобразуют в список через list().
Как это работает подробнее
Синтаксис — zip(*iterables): элементы с индексом 0 образуют первый кортеж, элементы с индексом 1 — второй и так далее.
- Механизм. Функция попарно соединяет элементы переданных коллекций:
names[0]иscores[0]попадают в один кортеж. - Короткий вход. Обход останавливается на самом коротком из переданных объектов, а лишние элементы длинных коллекций просто игнорируются.
- Ленивый итератор. Кортежи создаются по требованию, поэтому для просмотра результата нужен
list()или прямой обход в цикле. - Одноразовость. Как и любой итератор, объект
zipможно использовать один раз — для повторного обхода результат сохраняют в список.
Пример кода
Объединение коллекций через zip()
names = ['Hiro', 'Mila', 'Tariq']
scores = [88, 94]
res = zip(names, scores)
print(list(res)) # [('Hiro', 88), ('Mila', 94)] — 'Tariq' отброшен
# Совместный проход по двум спискам
for name, score in zip(names, scores):
print(name, score)
# Построение словаря
d = dict(zip(['a', 'b'], [1, 2])) # {'a': 1, 'b': 2}Что использовать на практике
- Совместный обход. Применяй
for x, y in zip(a, b), чтобы идти по нескольким спискам одновременно без обращения по индексам. - Построение словаря. Связка
dict(zip(keys, values))превращает два списка в словарь, где элементы первого становятся ключами. - Обратная операция. Распаковка
zip(*pairs)разделяет кортежи обратно на отдельные последовательности.