我在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)。我想将这些存储到我创建的动态列表中。请帮忙。
答案 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。