gpt4 book ai didi

Python:从嵌套迭代器组成列表

转载 作者:行者123 更新时间:2023-11-28 21:59:27 25 4
gpt4 key购买 nike

我有一个元组列表,我需要通过添加两个元素来扩展它,每个元素都来自一个列表。所以我有 [(1, 2, 3)] 和两个迭代器 it1 = (i for i in ['a1', 'a2']) it2 = (i for i in in ['b1', 'b2'])。结果应该是 [(1, 2, 3, 'a1', 'b1'), (1, 2, 3, 'a1', 'b2'), (1, 2, 3, 'a2' , 'b1'), (1, 2, 3, 'a2', 'b2')].

如果我使用上面显示的迭代器,它就不起作用。但是,如果我使用列表,它就可以工作。这是代码:

def get_iters():
return ((i for i in ['a1', 'a2']), (i for i in ['b1', 'b2']))

def get_lists():
return ([i for i in ['a1', 'a2']], [i for i in ['b1', 'b2']])

def compose(lst_of_tuples, iter=True):
iters = get_iters() if iter else get_lists()
for it in iters:
lst_of_tuples = [t + (i,) for t in lst_of_tuples for i in it]
return lst_of_tuples

print compose([(1,2,3)], True)
# WRONG!???? (what happened to the 'a2' part of it?)
# prints: [(1, 2, 3, 'a1', 'b1'), (1, 2, 3, 'a1', 'b2')]

print compose([(1,2,3)], False)
# RIGHT!! prints: [(1, 2, 3, 'a1', 'b1'), (1, 2, 3, 'a1', 'b2'), (1, 2, 3, 'a2', 'b1'), (1, 2, 3, 'a2', 'b2')]

我想不出为什么会这样。谁能解释一下?

最佳答案

Iterables 只能迭代一次,之后它们就用完了。

在 for 循环中第二次遍历给定的可迭代对象时,不再返回任何元素。

首先遍历 itertools.product(),然后遍历元组列表以生成输出:

from itertools import product

def compose(lst_of_tuples, iter=True):
iters = get_iters() if iter else get_lists()
return [t + i for i in product(*get_iters()) for t in lst_of_tuples]

这会产生:

>>> print compose([(1,2,3)], True)
[(1, 2, 3, 'a1', 'b1'), (1, 2, 3, 'a1', 'b2'), (1, 2, 3, 'a2', 'b1'), (1, 2, 3, 'a2', 'b2')]
>>> print compose([(1,2,3)], False)
[(1, 2, 3, 'a1', 'b1'), (1, 2, 3, 'a1', 'b2'), (1, 2, 3, 'a2', 'b1'), (1, 2, 3, 'a2', 'b2')]

关于Python:从嵌套迭代器组成列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16595994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com