从列表元素中获取数字

时间:2017-04-25 19:41:19

标签: python algorithm subset-sum

我如何检查可以从列表元素创建数字?

例如: 列表= [1,1,3,3,3,3,5,10,23,53]

现在我们可以从[1,3,5]或[3,3,3]获得9 我尝试过类似的东西:

list=[1,1,3,3,3,3,5,10,23,53]
tmp=[]
sum=0

for i in range(len(list)):
  tmpChange=9
  tmpChange -= list[i]+sum
  if tmpChange == 0:
      break
  elif tmpChange > 0:
      tmp.append(list[i])
      sum += list[i]
      print(tmpChange)
      print(tmp)
  else:
      tmp.pop(i)

1 个答案:

答案 0 :(得分:3)

一种天真的方法是找到原始列表的所有子集,您可以使用itertools.combinations来完成。然后,您可以检查子集是否与原始值相加,然后将它们添加到set

import itertools
l = [1,1,3,3,3,3,5,10,23,53]
total = 9
values = set()
for r in range(1, len(l)):
    for c in itertools.combinations(l, r):
        if sum(c) == total:
            values.add(tuple(c))

结果是

>>> values
{(1, 3, 5), (3, 3, 3)}

使用以下数据的另一个例子

l = [1,1,3,3,3,3,4,5,9,10,23,53]

结果将是

>>> values
{(4, 5), (3, 3, 3), (1, 1, 3, 4), (1, 3, 5), (9,)}