zip和zip_longest如何在python 3.x中处理可迭代对象?

fcg9iug3  于 2023-06-07  发布在  Python
关注(0)|答案(1)|浏览(126)

这是我的代码片段

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)

反正这也是我想要的我只是感到困惑,因为据我所知,zipzip_longest对每个项元素进行了配对。如果args应该有相同的迭代器对象引用四次,并且有相同的第一个,第二个等元素,那么为什么这会连续输出原始列表?

camsedfj

camsedfj1#

看看发生了什么:

[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建议

相关问题