根据通过嵌套循环找到的匹配关键字对字典值求和

sum dictionary values based on matched key words found via nested loop

尝试将字典中的所有值与包含 lstA 中元素的键相加并根据 lstA 进行分组。但是下面的代码呈现了所有 dict 值的总和。我该如何解决?

举例说明:

lstA = ['R0', 'R1', 'R2', 'R3']
lstB = [('R0', 'R1'), ('R0', 'R2'), ('R0', 'R3'), ('R0', 'R4'), ('R1', 'R2'), ('R1', 'R3'), ('R2', 'R3')]
dict = {('R0', 'R1'): 0.04, ('R0', 'R2'): 0.05, ('R0', 'R3'): 0.03, ('R1', 'R2'): 0.1, ('R1', 'R3'): 0.06, ('R2', 'R3'): 0.074}

output = []
for i in range(len(lstA)):
    for j in range(len(lstB)):
        if lstA[i] in lstB[j]:
            result += dict[lstB[j]]
output.append(result)
print(output)

我认为这是缩进的问题,你要做的是:

lstA = ['R0', 'R1', 'R2', 'R3']
lstB = [('R0', 'R1'), ('R0', 'R2'), ('R0', 'R3'), ('R0', 'R4'), ('R1', 'R2'), ('R1', 'R3'), ('R2', 'R3')]
dic = {('R0', 'R1'): 0.04, ('R0', 'R2'): 0.05, ('R0', 'R3'): 0.03, ('R1', 'R2'): 0.1, ('R1', 'R3'): 0.06, ('R2', 'R3'): 0.074}

output = []
for i in range(len(lstA)):
    result = 0
    for j in range(len(lstB)):
        if lstA[i] in lstB[j] and lstB[j] in dic:
            result += dic[lstB[j]]
    output.append(result)
print(output)

这样做:

  • key的元素在LstA中
  • key也在LstB

    result = 0
    output = []
    for key, value in dict.items():
        element1, element2 = key
        if (element1 in lstA and element2 in lstA
            and key in lstB):
            result += value
            output.append(value)
    print(result, output)
    0.35400000000000004 [0.04, 0.05, 0.03, 0.1, 0.06, 0.074]
    

这是您要找的吗?

@LouisSugy 回答的更多 pythonic 版本

>>> lst_a = ['R0', 'R1', 'R2', 'R3']
... lst_b = [('R0', 'R1'), ('R0', 'R2'), ('R0', 'R3'), ('R0', 'R4'), ('R1', 'R2'), ('R1', 'R3'), ('R2', 'R3')]
... d = {('R0', 'R1'): 0.04, ('R0', 'R2'): 0.05, ('R0', 'R3'): 0.03, ('R1', 'R2'): 0.1, ('R1', 'R3'): 0.06, ('R2', 'R3'): 0.074}
... 
>>> output = []
... for elem in lst_a:
...     result = 0
...     for pair in lst_b:
...         if elem in pair:
...             try:
...                 result += d[pair]
...             except KeyError:
...                 pass
...     output.append(result)
... 
>>> output
[0.12, 0.2, 0.22400000000000003, 0.16399999999999998]

不过我不确定 lst_b 的意义何在。如果在 d 中没有匹配的键而您要跳过它们,那么为什么不直接遍历 d 的键呢?这给出了相同的结果,没有潜在的 KeyErrors(已接受答案中的 and lstB[j] in dic 部分)。

>>> output = []
... for elem in lst_a:
...     result = 0
...     for key_pair, value in d.items():
...         if elem in key_pair:
...             result += value
...     output.append(result)
... 
>>> output
[0.12, 0.2, 0.22400000000000003, 0.16399999999999998]