如何找到加起来等于给定总和的索引和组合?

时间:2020-06-12 16:14:47

标签: 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: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}

2 个答案:

答案 0 :(得分:2)

您的代码很接近,我将使用枚举以元组对的形式获取索引和值。我总是删除任何索引和值元组,其中该值大于目标值,因为这不可能匹配。这将产生较少的组合。然后像您一样,我只遍历元组的排列并在每个排列中求和,如果它求和到目标,则产生该排列。最后在循环中输出值,我将烫发给字典以转换为所需的字典格式

HTTPStreamType

输出

interface MyCommonData {
    foo: string
    bar: number
}

interface WebSocketData extends MyCommonData {
    type: 'WEBSOCKET'
    connection: WebSocketType
}

interface HttpStreamData extends MyCommonData {
    type: 'HTTP_STREAM';
    connection: HTTPStreamType;
}

type MyData = WebSocketData | HttpStreamData

答案 1 :(得分:0)

您可以只使用索引函数来获取索引并将其存储为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有效,以前不起作用。

希望这会有所帮助!