Python 3.x 如何找到加起来等于给定总和的指数和组合?

Python 3.x 如何找到加起来等于给定总和的指数和组合?,python-3.x,list,itertools,Python 3.x,List,Itertools,如何找到加在一起的组合和相应的指数? 此外,它是否可以处理大小为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:

如何找到加在一起的组合和相应的指数? 此外,它是否可以处理大小为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)]
已尝试:

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}

您的代码很接近,我将使用enumerate以元组对的形式获取索引和值。我总是删除任何索引元组和值元组,其中的值大于目标值,因为这不可能是匹配的。这将生成更少的组合。然后像你一样,我只是迭代元组的排列,然后对每个排列中的值求和,如果它和目标值求和,那么就产生那个排列。最后,在输出值的循环中,我将perm-to-dict转换为所需的dict格式

来自itertools导入组合的

def find_sum_与_索引(l1,目标):
索引_vals=[如果iv[1]<目标,则枚举(l1)中的iv对应iv]
对于范围(1,len(索引值)+1)内的r:
对于组合排列(索引值,r):
如果sum([p[1]表示perm中的p])==目标:
产量烫
l1=[9,1,2,7,6,1,5]
目标=8
对于find_sum_与_索引(l1,目标)中的匹配:
打印(笔录(匹配))
输出

{1:1,3:7}
{2: 2, 4: 6}
{3: 7, 5: 1}
{1: 1, 2: 2, 6: 5}
{1: 1, 4: 6, 5: 1}
{2: 2, 5: 1, 6: 5}

您可以使用index函数获取索引,并在字典的帮助下将其存储为key:value对,如下面的列表中

from itertools import combinations

def test(l1, target):
    l2 = []
    l3 = []
    l4=[]
    dict1={}
    a=0
    if len(l1) > 0:
        for r in range(0,len(l1)+1):        
            l2 += list(combinations(l1, r))

        for i in l2:
            dict1={}
            if sum(i) == target:

                for j in i:
                    a=l1.index(j)
                    dict1[a]=j
                l4.append(dict1)
                l3.append(i)

    return l4

l1 = [4,6,8,5,3]
target = 3

print(test(l1,target))
输出:

[{4: 3}]
正如您所看到的,条件
l1=[4,6,8,5,3]target=3
起作用,而之前不起作用


希望这有帮助

您的代码在哪里显示了您为解决问题所做的努力,或者代码中任何不起作用的问题。我建议查看itertools模块之类的功能,如combinations@ChrisDoyle:在上面发布了我尝试过的解决方案。我无法在这里跟踪相应的索引。还有更好的办法吗?保持性能、执行时间和处理列表中大量元素。@克里斯·道尔:有什么想法吗?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}。我应该为这个问题单独提出一个问题吗?很有趣。看起来不错,但无法处理几个场景,更新部分中的场景更新了问题。你真的不知道在我的代码中需要更新什么才能使其适用于你的新示例吗?只需将
if iv[1]
更改为
if iv[1]非常好,就是这样。抱歉,我没注意到。谢谢,克里斯,我在想另一个场景。如果输入=[9,6,8,1,7],目标=5,输出={3:1,3:1,3:1,3:1,3:1}。因为,可以将1添加5次以使其成为target.Input=[4,6,8,3,5,3],target=3,所以它打印[{3:3},{3:3}],而不是{5:3,3:3}。而且,它应该是一个字典,由这些组合组成。这就是拥有多个相同值的问题,因为我使用了index()方法,它返回该值第一次出现的索引。