根据通过嵌套循环找到的匹配关键字对字典值求和
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
的键呢?这给出了相同的结果,没有潜在的 KeyError
s(已接受答案中的 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]
尝试将字典中的所有值与包含 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
的键呢?这给出了相同的结果,没有潜在的 KeyError
s(已接受答案中的 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]