2016-08-09 42 views
3

我有一個包含1000多個默認字典的字典,我想遍歷每個默認字典,然後將它們在鍵上求和,然後除以count得到每個鍵的平均值。在key上添加defaultdicts,然後除以它們

每個默認dict有相同的密鑰,即

{'A': 0.0, 'B': 1.0, 'C': 1.0, 'D': 1.0, 'E': 1.0} 
{'A': 2.0, 'B': 1.2, 'C': 3.0, 'D': 1.0, 'E': 3.0} 

我想下面是我的輸出

{'A': 1.0, 'B': 1.1, 'C': 2.0, 'D': 1.0, 'E': 2.0} 

如何反覆添加默認類型的字典起來,然後將其劃分,一數據框中的行操作?還是有更好的方法來做到這一點?

感謝

+0

它是有關在所有的這些都是defaultdicts? –

+0

不,這正是我閱讀他們的方式,我可以把它們看作是我猜想的其他東西。 – SharpObject

回答

5

如何使用字典理解與sum

d1 = {'A': 0.0, 'B': 1.0, 'C': 1.0, 'D': 1.0, 'E': 1.0} 
d2 = {'A': 2.0, 'B': 1.2, 'C': 3.0, 'D': 1.0, 'E': 3.0} 
dicts = {"d1": d1, "d2": d2} 
n = len(dicts) 
res = {k: sum(d[k] for d in dicts.values())/n for k in d1} 
# {'A': 1.0, 'B': 1.1, 'C': 2.0, 'D': 1.0, 'E': 2.0} 

注:這是假設,因爲你在問題中寫道,所有類型的字典有的相同的鍵或defaultdicts,以便丟失的鍵不會導致錯誤。

0

在一個迭代字典的鍵和值和值添加到其他字典上的相應鍵的值。
例子:

dict1 = {'A': 0.0, 'B': 1.0, 'C': 1.0, 'D': 1.0, 'E': 1.0} 
dict2 = {'A': 2.0, 'B': 1.2, 'C': 3.0, 'D': 1.0, 'E': 3.0} 
for key,value in dict1.iteritems(): 
    dict2[key] = (value + dict2[key])/2 
print dict2 # prints {'A': 1.0, 'B': 1.1, 'C': 2.0, 'D': 1.0, 'E': 2.0 } 

爲了簡單起見,你可能只需要創建一個新的字典,以及:

dict1 = {'A': 0.0, 'B': 1.0, 'C': 1.0, 'D': 1.0, 'E': 1.0} 
dict2 = {'A': 2.0, 'B': 1.2, 'C': 3.0, 'D': 1.0, 'E': 3.0} 
dictAns = dict() 
for key,value in dict1.iteritems(): 
    dictAns[key] = (value + dict2[key])/2 
print dictAns # prints {'A': 1.0, 'B': 1.1, 'C': 2.0, 'D': 1.0, 'E': 2.0 } 
+0

爲什麼你迭代項目似乎你只使用密鑰。 –

+0

@tobias_k:那麼,他們可以通過用'value'替換'dict1 [key]'來保存查找。 – ShadowRanger

+0

如果我有兩本以上的字典,該怎麼辦? – SharpObject

4

可以簡化這個有點用collections.Counter

summed_dict = collections.Counter() 
for d in partial_dicts: 
    summed_dict.update(d) 

# Use .viewitems or .iteritems instead of .items on Py2 
average_dict = {k: v/len(partial_dicts) for k, v in summed_dict.items()} 
4

您可以使用pandas.Series執行兩個字典值的平均,然後轉換該系列回詞典:

import pandas as pd 

a = pd.Series({'A': 2.0, 'B': 1.2, 'C': 3.0, 'D': 1.0, 'E': 3.0}) 
b = pd.Series({'A': 0.0, 'B': 1.0, 'C': 1.0, 'D': 1.0, 'E': 1.0}) 
c = ((a+b)/2).round(1) 
print(c.to_dict()) 
# {'A': 1.0, 'B': 1.1, 'D': 1.0, 'E': 2.0, 'C': 2.0} 
1

關於你的數據類型的字典詞典,那麼這是我會怎麼做(相當實用的方法):


d = {1: {'A': 0.0, 'B': 1.0, 'C': 1.0, 'D': 1.0, 'E': 1.0}, 
2: {'A': 2.0, 'B': 1.2, 'C': 3.0, 'D': 1.0, 'E': 3.0}} 

import functools 

def add_dicts(d1, d2): 
    return {k:d1[k]+d2[k] for k in d1} 

dsum = functools.reduce(add_dicts, d.values()) 

N = len(d.keys()) 
davg = {k:v/N for k,v in dsum.items()} 
print(davg) 

輸出:

{'C': 2.0, 'E': 2.0, 'A': 1.0, 'B': 1.1, 'D': 1.0} 
相關問題