【问题标题】:Is there a way to get a new list of ints from a list of ints, that add up to a certain value? [duplicate]有没有办法从一个整数列表中获取一个新的整数列表,加起来等于某个值? [复制]
【发布时间】:2020-08-19 16:43:15
【问题描述】:

我有一个整数列表,它们是随机排序的,可能会重复:mylist = [5,4,2,4,5,6,7,3,8,3] 和某个值(例如:value=35

现在我想从mylist 中获取整数列表,我们将其命名为sumlist,其中包括所有可能的数字选项,它们加起来等于value

所以当我会做的时候:

sum=0
for i in  sumlist[0]:
   sum+=i

sum == value 将返回 True

【问题讨论】:

  • 在有多个选项可以求和的情况下,您想做什么? IE。 [1,2,3,4,5,6] value=10 其中我可以 5+4+1 或 6+4 或 1+2+3+4
  • mylist 是否总是包含从 1 到 len(mylist) 的所有数字并已排序?请分享您尝试解决问题的代码。
  • @OrY 如果可能的话,我只想要多个选项中的一个随机选项。
  • 使用递归函数。循环遍历列表的元素,从所需的总和中减去该元素,然后使用减少的总和和列表的其他元素递归调用该函数。

标签: python list sum add


【解决方案1】:

Itertools.combinations 很容易做到这一点。当您为其提供列表和长度时,它将给出该长度的所有可能组合,并且与排列不同,它会删除重复项。为确保尝试每个选项,必须尝试每个长度(从 0 到完整字符串),如下所示:

import itertools
def SumList(MyList,Value):
    for Length in range(1,len(MyList)):          
        for ListOfVals in itertools.combinations(MyList,Length): 
            Total=0
            for num in ListOfVals:
                Total+=num
            if Total==Value:
                
                return(ListOfVals)
                
mylist=[5,4,2,4,5,6,7,3,8,3]
value=35
print(SumList(mylist,value))



>>[5,4,5,6,7,8]

作为一个快速的旁注,这将始终输出最短的组合,因为它会从最短到最长的长度进行迭代。

【讨论】:

  • list 不需要循环 itertools.combinations(MyList,Num) 并且应该是 for Num in range(1,len(MyList)),因为 0 不会产生总和。
  • 另外,只是样式,请考虑在同一代码中不要有 Numnum 的名称。令人困惑...但这很好!
  • 感谢您的建议!当我打印整个内容时,列表仍然存在,看看它是如何工作的,nums 只是没有重新阅读我的代码。只是出于兴趣,遍历 0 是否也被认为是不好的做法?我从来没有想过要阻止它。
  • Bob:IMO,在这种情况下,跳过零可能是一个非常小的优化。
猜你喜欢
  • 2018-05-07
  • 2020-09-07
  • 2022-11-04
  • 2020-10-01
  • 2019-09-30
  • 2017-07-03
  • 1970-01-01
  • 1970-01-01
  • 2020-08-11
相关资源
最近更新 更多