【发布时间】:2017-10-08 22:21:06
【问题描述】:
我需要这样做:我有整数列表,我制作包含 3 个这些数字的所有可能组合,输出是包含这些组合总和的列表。 (不是所有组合的总和,而是每个组合一个总和)
我的算法是这样做的:列出所有可能的组合,然后计算每个组合的总和并将其保存到列表中,如果整数数量很大,那太无效了。这是python中的小示例:
import itertools
array=[1,2,3,4]
combs=[]
els = [list(x) for x in itertools.combinations(array, 3)]
combs.extend(els)
result=list(map(sum, combs))
您能想出一些更有效的解决方案吗?也许如果有某种方法可以使它成为一个循环,首先没有列出组合列表,然后计算每个组合的总和,而是直接计算刚刚创建的组合的总和,将其保存到列表中,然后继续另一个直到所有组合和总和完成。
【问题讨论】:
-
你为什么不直接去
[sum(x) for ...]?将元组转换为列表,然后将列表列表转换为新的列表列表,然后再转换为另一个新的整数列表,似乎完全没有意义。 -
在不消除“组合”组件的情况下,您无法对大 n 进行有效处理。这本质上是低效的(请参阅combinatorial explosion)您需要一种不同的方法来解决您的问题。但为此,您需要先定义您的问题。
-
最好不要列一个清单。看看您是否可以重新组织您的逻辑,以便您可以在每个总和产生时对其进行操作。例如,
for s in map(sum, combinations(array, 3)): do_stuff(s)