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

Python 如何将字典中的列表值划分为另一个列表?,python,dictionary,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]} 在获得所有键的所有值总和后,根据 bb的结果是[0.96,0.19,0.3,1.26,0] 我想将每个键中的值除以bb,结果必须是: {"A": [0, 0.63, 0, 0.57, 0], "B": [1, 0, 1, 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
的结果是
[0.96,0.19,0.3,1.26,0]

我想将每个键中的值除以bb,结果必须是:

{"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))
但其结果并不正确

{'A': [<generator object <genexpr> at 0x7f998d0640f0>], 'C': [<generator object <genexpr> at 0x7f998d064140>], 'B': [<generator object <genexpr> at 0x7f998d0640a0>], 'D': [<generator object <genexpr> at 0x7f998d064050>]}
{'A':[],'C':[],'B':[],'D':[]}

对每个列表值使用列表理解;无需在此处使用
dict.setdefault()
,并且使用
value
(列表之一),而不是
aa
(整个字典)作为
zip()的输入:

您确实需要测试
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()}
演示:


如果您需要这样的计算,最好使用numpy
代码将非常容易阅读和输入,根本不需要使用循环

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)

您的代码和意外输出不匹配。这表明你使用了
append()
,而不是
extend()
。你为什么要发布相同的问题:?嗨@Ashwini Chaudhary,对不起,我是stackoverflow的新手,我无法完全解释这篇文章,所以将其删除并重新发布。嗨@Po Stevanus and Rianta,我收到错误:
AttributeError:“list”对象没有属性“get”
该@nickan aa是一个dict而不是列表有问题,请检查这里
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]}
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)