2017-07-31 65 views
-2

在与列表中的每个键的多个值的字典,如何将字典中的列表值分成另一个列表?

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

结果为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>]} 
+0

你r代码和意外输出做**不匹配**。这表明你使用了'append()'而不是'extend()'。 –

+0

为什么你重新发布相同的问题:https://stackoverflow.com/questions/45408275/how-to-divide-values-in-a-dictionary-to-sum-of-values? –

+0

嗨@Ashwini Chaudhary,对不起,我是新的stackoverflow,我无法完全解释那篇文章,所以删除它并转贴。 – nickan

回答

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避免事业部by-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]} 
+0

嗨@Martijn彼得斯,感谢它做得非常好。 – nickan

1

,如果你需要这样的计算,更好地使用numpy的
代码会更加easire阅读和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) 
+0

您好@Po Stevanus Andrianta,我收到错误:'AttributeError:'list'object has no attribute'get'' – nickan

+1

有什么不对吗@nickan aa是字典而不是列表 请在这里检查https:// repl .it/Jrb6/0 –

+0

没错,谢谢@Po Stevanus Andrianta。 – nickan

相关问题