Короткий ответ
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)разделяет кортежи обратно на отдельные последовательности.
Подводные камни
- Потеря хвоста. Если коллекции разной длины, лишние элементы молча отбрасываются — об этом легко забыть.
- Одноразовый итератор. Повторный обход одного и того же объекта
zipничего не даст: итератор уже исчерпан. - Забытый list(). Без преобразования в список объект
zipвыглядит как адрес в памяти и не показывает готовые кортежи.
Как отвечать на собеседовании
- Объясни, что
zip()соединяет элементы коллекций в кортежи по индексам и возвращает ленивый итератор → приведи пример со списками имён и баллов → подчеркни, что обход идёт до самого короткого объекта → покажи типичное применение: цикл по нескольким спискам иdict(zip(keys, values)).