【发布时间】:2013-05-05 11:36:55
【问题描述】:
给定多个可能不同长度的列表,我想迭代所有值组合,每个列表中的一项。例如:
first = [1, 5, 8]
second = [0.5, 4]
那么我希望的输出是:
combined = [(1, 0.5), (1, 4), (5, 0.5), (5, 4), (8, 0.5), (8, 4)]
我想遍历 combined 列表。我该如何完成这项工作?
【问题讨论】:
给定多个可能不同长度的列表,我想迭代所有值组合,每个列表中的一项。例如:
first = [1, 5, 8]
second = [0.5, 4]
那么我希望的输出是:
combined = [(1, 0.5), (1, 4), (5, 0.5), (5, 4), (8, 0.5), (8, 4)]
我想遍历 combined 列表。我该如何完成这项工作?
【问题讨论】:
itertools.product 应该可以解决问题。
>>> 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 返回一个迭代器,因此如果您只打算对其进行一次迭代,则无需将其转换为列表。
例如。
for x in itertools.product([1, 5, 8], [0.5, 4]):
# do stuff
【讨论】:
second = [0.5, 4, 1] 并且我们认为输出(1, 4) 与输出(4, 1) 相同呢?
4,并且您只想要结果中的唯一输出)我认为您之后只需使用 set(tuple(sorted(lst)) for lst in itertools.product(...)) 或类似的东西进行过滤那个。
(0.5, 1), (0.5, 5), (0.5, 8), (4, 1), (4, 5), (4, 8)?
* 将其解压缩为单独的参数(请参阅 this)。
这可以通过使用list comprehension 来实现,而无需任何导入。使用您的示例:
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)]
【讨论】:
itertools 方法可以覆盖任意数量的列表,例如itertools.product(*my_lists)。这是更通用的,有时是必要的。