zip()
принимает один или несколько итерируемых объектов (списки, кортежи, строки и т.д.) в качестве аргументов. Она возвращает итератор, который генерирует последовательность кортежей. Каждый кортеж содержит элементы из входных итерируемых объектов, расположенные на одной и той же позиции (индексе). zip()
определяется кратчайшим из входных итерируемых объектов. То есть, если один из итерируемых объектов короче остальных, итератор zip()
остановится, когда достигнет конца этого кратчайшего объекта. Лишние элементы из более длинных итерируемых объектов будут проигнорированы.Функция zip()
в Python - это встроенная функция, которая позволяет итерировать одновременно по нескольким последовательностям (например, спискам, кортежам, строкам). Она принимает в качестве аргументов одну или несколько итерируемых объектов и возвращает итератор кортежей. Каждый кортеж содержит элементы, взятые из соответствующих позиций каждого входного итерируемого объекта.
Как это работает:
zip()
берет первый элемент из каждой переданной последовательности и формирует из них первый кортеж.zip()
прекращает итерацию, как только самая короткая последовательность будет исчерпана. Все элементы из более длинных последовательностей, находящиеся за пределами длины самой короткой, игнорируются.Пример:
list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']
list3 = ['!', '@', '#', '$'] # Длиннее остальных
zipped = zip(list1, list2, list3) # Итератор, содержащий кортежи
for item in zipped:
print(item)
# Вывод:
# (1, 'a', '!')
# (2, 'b', '@')
# (3, 'c', '#')
Важные моменты:
zip()
возвращает итератор. Для получения списка кортежей необходимо использовать list(zip(...))
.*
можно "распаковать" список последовательностей для передачи в zip()
.zip()
возвращает итератор. В Python 2 он возвращал список.Распаковка с помощью `*`:
data = [ [1, 2, 3], ['a', 'b', 'c'] ]
zipped = zip(*data) # Эквивалентно zip([1, 2, 3], ['a', 'b', 'c'])
for item in zipped:
print(item)
# Вывод:
# (1, 'a')
# (2, 'b')
# (3, 'c')
Обратное преобразование:
list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']
zipped = zip(list1, list2)
unzipped = zip(*zipped) # обратное преобразование
list1_new, list2_new = list(unzipped[0]), list(unzipped[1]) # преобразовать в списки (в Python 3)
print(list1_new) # [1, 2, 3]
print(list2_new) # ['a', 'b', 'c']
В общем, zip()
- это удобный и эффективный инструмент для работы с несколькими последовательностями одновременно.