在每个键的列表中包含多个值的字典中
aa = {"A": [0, 0.12, 0, 0.73, 0], "B": [0.96, 0, 0.30, 0, 0], "C": [0, 0, 0, 0.11, 0], "D": [0, 0.07, 0, 0.42, 0]}
在根据How to sum values in dictionary based on position?
的答案获得所有键排列的所有值之后bb = [sum(value) for value in zip(*aa.values())]
<{1}}的结果为bb
。
我想将每个键中的值除以bb,结果必须是:
[0.96, 0.19, 0.3, 1.26, 0]
我试过这段代码:
{"A": [0, 0.63, 0, 0.57, 0], "B": [1, 0, 1, 0, 0], "C": [0, 0, 0, 0.087, 0], "D": [0, 0.36, 0, 0.33, 0]}
但结果不正确。
aa = {"A": [0, 0.12, 0, 0.73, 0], "B": [0.96, 0, 0.30, 0, 0], "C": [0, 0, 0, 0.11, 0], "D": [0, 0.07, 0, 0.42, 0]}
bb = [sum(value) for value in zip(*aa.values())]
cc = {}
for key, value in (aa.items()):
cc.setdefault(key, [])
cc[key].append((x*1.0)/y for x, y in zip(aa, bb))
答案 0 :(得分:1)
对每个列表值使用列表推导;这里不需要使用dict.setdefault()
,并使用value
(其中一个列表),而不是aa
(整个词典),作为zip()
的输入:
cc = {}
for key, value in aa.items():
cc[key] = [0.0 if not y else ((x * 1.0) / y) for x, y in zip(value, bb)]
您需要测试y == 0.0
以避免被0分割错误。
你也可以在这里使用词典理解:
cc = {key: [0.0 if not y else ((x * 1.0) / y) for x, y in zip(value, bb)]
for key, value in aa.items()}
演示:
>>> {key: [0.0 if not y else ((x * 1.0) / y) for x, y in zip(value, bb)] for key, value in aa.items()}
{'A': [0.0, 0.631578947368421, 0.0, 0.5793650793650793, 0.0], 'C': [0.0, 0.0, 0.0, 0.0873015873015873, 0.0], 'B': [1.0, 0.0, 1.0, 0.0, 0.0], 'D': [0.0, 0.368421052631579, 0.0, 0.3333333333333333, 0.0]}
答案 1 :(得分:1)
如果你需要这样的计算,最好使用numpy
代码将更容易阅读和intrepet,根本不需要使用循环
import numpy as np
aa = {"A": [0, 0.12, 0, 0.73, 0], "B": [0.96, 0, 0.30, 0, 0], "C": [0, 0, 0, 0.11, 0], "D": [0, 0.07, 0, 0.42, 0]}
aa = np.array([aa.get(a) for a in aa])
//or any bb you want
bb = np.array([2,2,2,2])
print((aa.T/bb).T)