【问题标题】:Combination sum higher than and lower than高于和低于的组合总和
【发布时间】:2021-09-22 22:36:54
【问题描述】:

我现在开始编程。我得到一个练习来生成 10 个数字和一组数字的组合,然后求和,这些数字的总和需要小于 800 且大于 700,然后打印结果和组合(打印所有组合)。

例如,如果一组数字是 10,20,30,40,50,60,70,80,90,100,我需要使用我设置的数字和该组合的总和来生成一组 10 个数字小于 560 大于 500。

10+20+30+40+50+60+70+80+90+100 = 550
10+20+30+40+50+40+100+80+90+90 = 550
..

我在 Python 中开始编写代码,但我有点卡住了,我如何对这些组合求和。

import itertools

myList = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
for i in range(len(myList)):
    for combinations in itertools.combinations(myList, i):
        print(combinations)

sum(e for e in combinations if e >= 550)

【问题讨论】:

  • 你有一个重复的 40 个,其中一个移到了 50 个后面,所以我猜你真的想要产品而不是组合?
  • 在此社区和其他社区(例如 unix.stackexchange.com (SE))中的适当礼仪和负责任的行为,在您交叉发布的地方,鼓励您根据他们的优点接受完美的答案。它向这些社区中的其他人发出信号,表明您的问题可以得到很好的答案并且可以重复使用。请在 SO 和 SE 上用左侧的绿色标记进行检查,为您指明最佳答案。

标签: python sum combinations itertools


【解决方案1】:

您非常接近,但您需要根据sum(e) 是否在所需范围内进行过滤,而不是根据e 本身是否在进行过滤。

>>> from itertools import combinations
>>> myList = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
>>> [e for i in range(len(myList)) for e in combinations(myList, i) if 500 < sum(e) < 560]
[(20, 40, 50, 60, 70, 80, 90, 100), (30, 40, 50, 60, 70, 80, 90, 100), (10, 20, 30, 50, 60, 70, 80, 90, 100), (10, 20, 40, 50, 60, 70, 80, 90, 100), (10, 30, 40, 50, 60, 70, 80, 90, 100), (20, 30, 40, 50, 60, 70, 80, 90, 100)]

【讨论】:

    【解决方案2】:

    combinations 仅存在于您的内部 for 循环中 - 您可以在打印后立即将其与 sum(combinations) 相加。您的 sum() 语句位于循环之外,其中不再定义 combinations

    类似:

    import itertools
    
    myList = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
    for i in range(len(myList)):
        for combinations in itertools.combinations(myList, i):
            if 500 < sum(combinations) < 560:
                print(combinations, sum(combinations))
    

    【讨论】:

    • 请注意,即使myList 的总和是 550,所以它需要小于 560 的条件是多余的
    • myList 中的数字组合(不重复)永远不会大于 550。这就像将正数相加并检查结果是否大于 0。
    • 他们的示例与问题和代码相矛盾,正如您已经在 cmets 中向 OP 指出的那样 - 无需在此处进行讨论。我将其添加为评论,以防我的答案是 OP 所追求的。如果事实证明他们在追求其他东西,则可以安全地忽略该评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多