【问题标题】:Converting combinations of integers into list of sums of these combinations将整数组合转换为这些组合的总和列表
【发布时间】: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)

标签: python algorithm


【解决方案1】:

sum() 适用于任何可迭代对象,而不仅仅是列表。您可以通过将代码直接应用于组合的元组来提高代码效率:

result = [sum(c) for c in itertools.combinations(array, 3)]

如果你想懒惰地处理结果,你也可以使用生成器表达式:

result = (sum(c) for c in itertools.combinations(array, 3))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2021-09-30
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多