找到不同的子数组,其总和等于python中

时间:2016-01-11 17:39:25

标签: python arrays pandas

我在pandas中有以下数据框

     order_id quant_bought
0       519            3
2       520            3
5       521            1
6       523            6
11      524            1
12      525            1
13      526            3
16      527            1
17      528            1
18      529            1
19      530            1
20      531            3
22      532            1
23      533            3
26      534            1
27      535            3

我要做的是,找到所有的quant_bought值等于总和6。 我有一个具有动态值的变量,经过一些计算得到。

required = 6

现在我基于上面的变量值生成6个动态列表

required = []
for i in range(required):
   required.append([])

上面的代码将生成6个动态列表。

现在我想用所有quant_bought个元素填充此列表,这些元素总和为6

看起来应该是这样的。

required1 = [1,1,1,1,1,1]
required2 = [1,1,1,3]
required3 = [3,3]
required4 = [3,3]
required5 = [6]
required6 = [3]    ## Which is left out   

和相应的索引,以便我可以在数据帧上进行子集化。 我在python中做了以下

## Sorting the dataframe in ascending order
tsp_data_unique_sorted = tsp_data_unique.sort(['quant_bought'], ascending=     
[True])


def tsum(currentSum,total,input,record,n):
   if total==sum :
      for i in range(0,n):
         if record[i]:
            print input[i]
        i = i+1
        for i in range(i,n):
            if record[i]:
                print input[i]
        print ""
        return

i = currentSum
for i in range(i,n):
    if total + input[i] > sum :
        continue
    if i > 0 and input[i] == input[i-1] and not record[i-1] : 
        continue
    record[i] = 1
    tsum(i + 1,total + input[i],input,record,l)
    record[i] = 0

record = []
sum = 6
input = tsp_data_unique_sorted['quant_bought'].values.tolist()
l = len(input)
for i in range(0,l):
   record.append(0)
print "From the array the elements equal to 6 are:"

这给了我以下输出。

tsum(0,0,input,record,l)

1
1
1
1
1
1

1
1
1
3

3
3

6

但是,它没有考虑3个要素(3,3,3)。我想将这些存储到我创建的动态列表中。请帮忙。

1 个答案:

答案 0 :(得分:2)

您正在描述已知为NP完全的subset-sum problem。来自wiki条目:

"given a set of integers and an integer s, does any non-empty subset sum to s?"

对于问题的小实例(短列表,小目标总和),动态编程/递归解决方案会很快,但会扩展得非常差。

另外,我不确定为什么你写的标题"找到独特的..."而在您提供的示例中,有多个子列表总和为6。