На этом шаге мы рассмотрим использование функции zip().
Вы хотите за один раз проитерировать по элементам, содержащимся более чем в одной последовательности.
Чтобы итерировать по более чем одной последовательности за раз, используйте функцию zip(). Например:
>>> xpts = [1, 5, 4, 2, 10, 7] >>> ypts = [101, 78, 37, 15, 62, 99] >>> for x, y in zip(xpts, ypts): print(x, y) 1 101 5 78 4 37 2 15 10 62 7 99 >>>
>>> a = [1, 2, 3] >>> b = ['w', 'x', 'y', 'z'] >>> for i in zip(a, b): print(i) (1, 'w') (2, 'x') (3, 'y') >>>
Если такое поведение нежелательно, используйте функцию itertools.zip_longest(). Например:
>>> from itertools import zip_longest >>> for i in zip_longest(a, b): print(i) (1, 'w') (2, 'x') (3, 'y') (None, 'z') >>> >>> for i in zip_longest(a, b, fillvalue=0): print(i) (1, 'w') (2, 'x') (3, 'y') (0, 'z') >>>
Функция zip() обычно используется тогда, когда вам нужно создать пары из данных. Предположим, что у вас есть список заголовков столбцов и значения столбцов:
headers = ['name', 'shares', 'price'] values = ['ACME', 100, 490.1]
Используя zip(), вы можете создать пары значений и поместить их в словарь:
s = dict(zip(headers, values))
Если вы хотите вывести результат, можно поступить так:
for name, val in zip(headers, values): print(name, '=', val)
Менее распространенное применение zip() заключается в том, что функции может быть передано не две последовательности, а больше. В этом случае кортежи результата будут иметь такое количество элементов, каким было количество последовательностей. Например:
>>> a = [1, 2, 3] >>> b = [10, 11, 12] >>> c = ['x', 'y', 'z'] >>> for i in zip(a, b, c): print(i) (1, 10, 'x') (2, 11, 'y') (3, 12, 'z') >>>
И последнее: важно подчеркнуть, что zip() возвращает итератор. Если вам нужны сохраненные в списке спаренные значения, используйте функцию list(). Например:
>>> zip(a, b) <zip object at 0x00000119831224C0> >>> list(zip(a, b)) [(1, 10), (2, 11), (3, 12)] >>>
На следующем шаге мы рассмотрим итерирование по элементам, находящимся в отдельных контейнерах.