Это мой фрагмент кода
from itertools import zip_longest
list1 = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
args = [iter(list1)] * 4
zipped = zip_longest(*args, fillvalue=None)
for j in zipped:
print(j)
Я ожидал, что он выведет что-то вроде
('a', 'a', 'a', 'a')
('b', 'b', 'b', 'b')
('c', 'c', 'c', 'c')
('d', 'd', 'd', 'd')
('e', 'e', 'e', 'e')
('f', 'f', 'f', 'f')
('g', 'g', 'g', 'g')
('h', 'h', 'h', 'h')
('i', 'i', 'i', 'i')
('j', 'j', 'j', 'j')
Но это выводит
('a', 'b', 'c', 'd')
('e', 'f', 'g', 'h')
('i', 'j', None, None)
Что я все равно хотел. Я просто запутался, потому что, насколько я понимаю, zip
и zip_longest
соединяют каждый элемент элемента по отдельности. Если args
должен иметь одну и ту же ссылку на объект итератора четыре раза и иметь один и тот же первый, второй и т. д. элемент, то почему это последовательно выводит исходный список?
1 ответ
Чтобы увидеть, что происходит:
[list(x) for x in [iter(list1)] * 4]
#[['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'], [], [], []]
Скорее вы можете сделать:
from itertools import zip_longest
list1 = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
args = [list(iter(list1))]*4
zipped = zip_longest(*args, fillvalue=None)
for j in zipped:
print(j)
#output
('a', 'a', 'a', 'a')
('b', 'b', 'b', 'b')
('c', 'c', 'c', 'c')
('d', 'd', 'd', 'd')
('e', 'e', 'e', 'e')
('f', 'f', 'f', 'f')
('g', 'g', 'g', 'g')
('h', 'h', 'h', 'h')
('i', 'i', 'i', 'i')
('j', 'j', 'j', 'j')
Или
[iter(list1) for _ in range(4)]
Как предложено @InSync
Похожие вопросы
Новые вопросы
python
Python — это мультипарадигмальный многоцелевой язык программирования с динамической типизацией. Он предназначен для быстрого изучения, понимания и использования, а также обеспечивает чистый и унифицированный синтаксис. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Если у вас есть вопросы о версии Python, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas, NumPy) укажите это в тегах.
[iter(list1)] * 4
создает 4 ссылки на один и тот же объектiter
, а не 4 разныхiter
, что означает, что два вызоваnext()
для этого объектаiter
приведут к двум соседним элементы вместо одного и того же элемента дважды.args = [iter(list1),iter(list1),iter(list1),iter(list1)]
iter
, используйте[iter(list1) for _ in range(0, 4)]
или что-то подобное.