Это мой фрагмент кода

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
kamote0330 30 Май 2023 в 20:15
5
[iter(list1)] * 4 создает 4 ссылки на один и тот же объект iter, а не 4 разных iter, что означает, что два вызова next() для этого объекта iter приведут к двум соседним элементы вместо одного и того же элемента дважды.
 – 
InSync
30 Май 2023 в 20:17
Чтобы продемонстрировать точку зрения @InSync, попробуйте args = [iter(list1),iter(list1),iter(list1),iter(list1)]
 – 
Scott Hunter
30 Май 2023 в 20:20
2
Если вам нужны 4 разных iter, используйте [iter(list1) for _ in range(0, 4)] или что-то подобное.
 – 
InSync
30 Май 2023 в 20:23

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

0
God Is One 30 Май 2023 в 20:28