在Python中迭代多个列表中的所有值组合

在Python中迭代多个列表中的所有值组合,python,iteration,Python,Iteration,给定多个长度可能不同的列表,我想迭代所有值的组合,每个列表中有一个项。例如: first = [1, 5, 8] second = [0.5, 4] 那么我希望的输出是: combined = [(1, 0.5), (1, 4), (5, 0.5), (5, 4), (8, 0.5), (8, 4)] 我想迭代组合列表。我怎样才能做到这一点呢?应该可以做到 >>> import itertools >>> list(itertools.product([1

给定多个长度可能不同的列表,我想迭代所有值的组合,每个列表中有一个项。例如:

first = [1, 5, 8]
second = [0.5, 4]
那么我希望的输出是:

combined = [(1, 0.5), (1, 4), (5, 0.5), (5, 4), (8, 0.5), (8, 4)]
我想迭代组合列表。我怎样才能做到这一点呢?

应该可以做到

>>> import itertools
>>> list(itertools.product([1, 5, 8], [0.5, 4]))
[(1, 0.5), (1, 4), (5, 0.5), (5, 4), (8, 0.5), (8, 4)]
请注意,
itertools.product
返回一个迭代器,因此,如果只对其进行一次迭代,则无需将其转换为列表

例如


这可以在不使用任何导入的情况下使用。以您的例子:

first = [1, 5, 8]
second = [0.5, 4]

combined = [(f,s) for f in first for s in second]

print(combined)
# [(1, 0.5), (1, 4), (5, 0.5), (5, 4), (8, 0.5), (8, 4)]

如果<代码>第二=[ 0.5,4, 1 ] < /代码>,我们认为输出<代码>(1, 4)< /> >与输出<代码>(4, 1)< /C> > @ ReeDePea(假设您在第一个列表中有一个<代码> 4 /代码>,并且您只希望结果中的唯一输出),我想您只需在以后使用集合(元组(排序)(LST)”进行过滤。对于itertools.product(…)或类似的东西中的lst。@Volatility,是否也可以添加以下组合:
(0.5,1)、(0.5,5)、(0.5,8)、(4,1)、(4,5)、(4,8)
?此解决方案的问题是,如果我们给产品方法列表,它将不起作用。我们应该只给它单独的清单,只有在这种情况下,它才能返回产品。如果我错了,请纠正我。@Pedram,没错。如果您只有列表列表,那么您需要使用
*
(请参阅)将其解压为单独的参数。对于当前的Python,这应该是最重要的答案。我可能错了,但我认为最初的顶级答案是针对Python2的——也许像这样的列表comp在当时是不可能的。我不同意@msm1089,列表理解的解决方案只适用于已知的少量原始列表。相反,
itertools
方法可以覆盖任意数量的列表,例如
itertools.product(*my_list)
。这是更一般的,有时是必要的。事实上,我同意你的观点@CedricDruck。最通用的是itertools方法。但是,正如你所说,如果只有少量的小列表,列表比较可能更好。好的一点,@CedricDruck,这两种方法都有自己的位置。不过,我认为大多数人都希望尽可能避免再次进口。OP在这里提出的具体问题是一小部分已知列表,因此答案非常适用。
first = [1, 5, 8]
second = [0.5, 4]

combined = [(f,s) for f in first for s in second]

print(combined)
# [(1, 0.5), (1, 4), (5, 0.5), (5, 4), (8, 0.5), (8, 4)]