/
Вопросы и ответы
/
Python
/

Что делает функция zip в Python?

Что делает функция zip в Python?

4 года назад

Andrey Moshkov

Ответы

4

Функция zip() принимает на входе несколько итерируемых объектов (iterable) или итераторов (iterators) и поэлементно группирует в кортежи. Функция останавливается, когда заканчиваются элементы в одном из источников. Относится к неперезапускаемым генераторам.

Пример:

1
2
3
4
5
6
7
8
user_names = ['Anna', 'Bob', 'Claire', 'Daniel']
user_age = [20, 25, 30]
zipped_values = zip(user_names, user_age)

print(list(zipped_values)) # => [('Anna', 20), ('Bob', 25), ('Claire', 30)]
# для Daniel возраста не осталось, функция остановилась
print(list(zipped_values)) # => []
# т.к. функция неперазапускаемая, повторный вызов вернул пустой список

4 года назад

Карина Абдуллаева

2

Функция zip() в Python используется для одновременной итерации по нескольким итерируемым объектам (например, спискам, кортежам, строкам) параллельно. Она создает итератор, который генерирует кортежи, состоящие из соответствующих элементов из каждого итерируемого объекта.

Важные моменты:

  • Длина итератора: Итератор, созданный zip(), будет иметь длину, равную длине самого короткого итерируемого объекта, переданного в функцию.
  • Разные типы данных: zip() может работать с итерируемыми объектами разных типов данных.
  • Создание словарей: zip() часто используется для создания словарей из двух списков, где один список содержит ключи, а другой - значения.

Пример с разной длиной итераторов:

1
2
3
4
5
6
7
8
list1 = [1, 2, 3]
list2 = ['a', 'b']

for x, y in zip(list1, list2):
  print(x, y)

# => 1 a
# => 2 b

В этом случае, так как list2 короче, чем list1, итерация прекращается после достижения конца list2

2 года назад

Olga Pejenkova

0

zip() берёт несколько последовательностей и собирает из них пары: первый элемент с первым, второй со вторым:

1
2
3
4
5
6
7
8
names = ['Анна', 'Олег', 'Мария']
ages = [25, 31, 28]

for name, age in zip(names, ages):
    print(name, age)
# Анна 25
# Олег 31
# Мария 28

zip возвращает итератор

1
2
3
4
pairs = zip(names, ages)
print(pairs)        # <zip object at 0x...>
print(list(pairs))  # [('Анна', 25), ('Олег', 31), ('Мария', 28)]
print(list(pairs))  # [] — итератор уже пройден

Результат можно перебрать один раз. Чтобы пользоваться им повторно, сохраните в список.

Разная длина

zip останавливается на самой короткой последовательности, лишние элементы теряются без ошибки:

1
print(list(zip([1, 2, 3], ['a', 'b'])))  # [(1, 'a'), (2, 'b')]

Чтобы получить ошибку при разной длине, передайте strict=True (Python 3.10+). Чтобы дополнить короткую последовательность, используйте itertools.zip_longest:

1
2
3
4
from itertools import zip_longest

print(list(zip_longest([1, 2, 3], ['a', 'b'], fillvalue='-')))
# [(1, 'a'), (2, 'b'), (3, '-')]

Словарь из двух списков

1
2
3
4
keys = ['name', 'age']
values = ['Анна', 25]
user = dict(zip(keys, values))
print(user)  # {'name': 'Анна', 'age': 25}

Обратная операция: разделить пары

1
2
3
4
pairs = [('Анна', 25), ('Олег', 31)]
names, ages = zip(*pairs)
print(names)  # ('Анна', 'Олег')
print(ages)   # (25, 31)

Транспонировать матрицу

1
2
matrix = [[1, 2, 3], [4, 5, 6]]
print([list(row) for row in zip(*matrix)])  # [[1, 4], [2, 5], [3, 6]]

Индекс вместе с парой

1
2
for i, (name, age) in enumerate(zip(names, ages), start=1):
    print(i, name, age)

Встроенные функции и итераторы разбирают в бесплатном курсе «Основы Python».

10 дней назад

Никита Вихров

+7 800 100 22 47

бесплатно по РФ

+7 495 085 21 62

бесплатно по Москве

108813 г. Москва, вн.тер.г. поселение Московский,
г. Московский, ул. Солнечная, д. 3А, стр. 1, помещ. 20Б/3
ОГРН 1217300010476
ИНН 7325174845