процесс функции zip () python - PullRequest
2 голосов
/ 12 апреля 2020

Я хочу задать вопрос о zip() в python.

Рассмотрим следующий простой код для демонстрации zip().

a = ['1', '2', '3']
b = ['a', 'b', 'c']

for key, value in zip(a, b):
    print(key + value)

Я знаю, что создается следующий вывод:

1a
2b
3c

, где каждый элемент в соответствующих списках объединяется.

Как новичок в Python3, я понимаю следующее о zip():

zip() создает объект zip, связанный с OOP, который можно показать с помощью list():

my_zip = zip(a, b)
print(my_zip)
print(list(my_zip))
>>> <zip object at 0xsomelocation>
>>>[('1', 'a'), ('2', 'b'), ('3', 'c')]

, так что объект zip является списком кортежей.

Моя путаница заключается в этой строке из исходного блока кода, который я на самом деле не понимаю:

for key, value in zip(a, b)

Моя интерпретация заключается в том, что, когда мы зацикливаемся на нашем zip объекте , у которого есть некоторый врожденный __next__() метод, вызываемый нашим for l oop, мы по очереди * l oop через каждый кортеж.

Для нашей первой итерации l oop мы получаем:

('1', 'a')

и python присваивает '1' и 'a' нашим переменным key и value соответственно. Это повторяется до конца измерений списка, т.е. 3 раза.

Это правильная интерпретация того, что происходит в нашем коде?

1 Ответ

1 голос
/ 12 апреля 2020

, так что объект zip является списком кортежей.

zip () не возвращает список кортежей. Он возвращает итератор кортежей, где i-й кортеж содержит i-й элемент из каждой последовательности аргументов или итераций.

Итератор останавливается, когда кратчайший итеративный ввод исчерпан. С единственным итерируемым аргументом, он возвращает итератор из 1 кортежа. Без аргументов он возвращает пустой итератор.

и python присваивают '1' и 'a' нашим переменным ключ и значение соответственно. Это повторяется до конца измерений списка, т.е. 3 раза.

Да. Остальная часть вашей интерпретации верна.

БОНУС:

zip () следует использовать только с входами неравной длины, если вам все равно о конечных, непревзойденных значениях из более длинных итераций. Если эти значения важны, используйте itertools.zip_longest () .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...