如何将字典中的列表值划分到另一个列表?

时间:2017-07-31 07:37:14

标签: python dictionary

在每个键的列表中包含多个值的字典中

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))

2 个答案:

答案 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)