【发布时间】:2020-06-12 16:14:47
【问题描述】:
如何找到加到给定 sum 的组合和对应的索引? 另外,是否可以处理大小为 500000(更大)的元素列表?
输入:
l1 = [9,1, 2, 7, 6, 1, 5]
target = 8
**Constraints**
1<=(len(l1))<=500000
1<=each_list_element<=1000
输出:
Format : {index:element}
{1:1, 5:1, 4:6} #Indices : 1,5,4 Elements : 1,1,6
{1:1, 2:2, 6:5}
{5:1, 2:2, 6:5}
{1:1, 3:7}
{5:1, 3:7}
{2:2, 4:6}
试过了:
from itertools import combinations
def test(l1, target):
l2 = []
l3 = []
if len(l1) > 0:
for r in range(0,len(l1)+1):
l2 += list(combinations(l1, r))
for i in l2:
if sum(i) == target:
l3.append(i)
return l3
l1 = [9,1, 2, 7, 6, 1, 5]
target = 8
print(test(l1,target))
[(1, 7), (2, 6), (7, 1), (1, 2, 5), (1, 6, 1), (2, 1, 5)]
有人可以指导我吗?
更新
Apart from above, code fails to handle these scenarios
Input = [4,6,8,5,3]
target = 3
Outputs {} , need to output {4:3}
Input = [4,6,8,3,5,3]
target = 3
Outputs {} , need to output {5:3,3:3} #corrected index
Input = [1,2,3,15]
target = 15
Outputs = {}, need to output {3:15}
【问题讨论】:
-
您的代码在哪里显示您为解决问题所做的努力或代码中任何不起作用的问题。我建议查看诸如组合之类的功能的 itertools 模块之类的东西
-
@ChrisDoyle:发布了上面的解决方案,我试过了。我无法在这里跟踪相应的索引。有更好的方法吗?保持性能、执行时间和处理更多列表中的元素。
-
@Chris Doyle:有什么想法吗?
-
l1 中的数字总是唯一的吗?您可以通过忽略所有大于目标的数字来减少组合的数量。我会使用 enumerate 来生成索引、值元组,然后从中进行组合。
-
@Chris Doyle:有时可能是独一无二的,但也存在重复元素。在这种情况下,我们需要考虑它们。输入=[1,6,7,1,3],目标=5,输出={0:1,3:1,4:3},{0:1,0:1,4:3},{3 :1,3:1,4:3}。我应该为此创建单独的问题吗?
标签: python-3.x list itertools