2014-01-09 39 views
-1

我有一個字典象下面這樣:如何從下面的字典中獲得平均值?

dict={idx1:{tokenA: 0.1, 
      tokenB: 1.3, 
      tokenD: 2.3}, 
     idx2:{tokenC: 0.9, 
      tokenE: 3.4}, 
     ... 
     idxn:{tokenA: 0.3, 
      tokenF: 0.4, 
      ... 
      tokenZ: 7.4} 
     } 

每個索引可以有不同的令牌/值,現在我希望得到平均每個令牌的,簡單的,如下:

{tokenA: average_value, tokenB: average_value, ... tokenZ: average_value) 

任何有效的方式來做這個?提前致謝!

+1

沒有嘗試過什麼? –

+0

我自己的解決方案非常複雜 - 我使用了很多子句。這就是爲什麼我要求更好的方法。 –

回答

1
d ={'idx1':{'tokenA': 0.1, 
      'tokenB': 1.3, 
      'tokenD': 2.3}, 
     'idx2':{'tokenC': 0.9, 
      'tokenE': 3.4}, 
     'idxn':{'tokenA': 0.3, 
      'tokenF': 0.4, 
      'tokenZ': 7.4} 
     } 

from collections import Counter 

token_sums = sum((Counter(v  ) for k,v in d.iteritems()), Counter()) 
token_counts = sum((Counter(v.keys()) for k,v in d.iteritems()), Counter()) 
token_mean = {k:token_sums[k]/token_counts[k] for k in token_sums} 
print token_mean 
+0

這對我來說很完美。 :) –

1
my_lists = defaultdict(list) 
for key,val in my_dict.items(): 
    for key2,val2 in val.items(): 
     my_lists[key2].append(val2) 

def average(key_val): 
    key,val = key_val 
    return (key, sum(val)*1.0/len(val)) 

print dict(map(average,my_lists)) 
0
import collections 

d ={'idx1':{'tokenA' : 0.1, 
      'tokenB': 1.3, 
      'tokenD': 2.3}, 
     'idx2':{'tokenC': 0.9, 
      'tokenE': 3.4}, 
     'idxn':{'tokenA': 0.3, 
      'tokenF': 0.4, 
      'tokenZ': 7.4} 
     } 

avg = collections.defaultdict(float) 
count = collections.Counter() 

for dat in d.itervalues(): 
    for k,v in dat.iteritems(): 
     avg[k] += v 
     count[k] += 1 

for k,v in count.iteritems(): 
    avg[k] /= count[k] 

print avg 
1

使用熊貓:

import pandas 

d = {'a': {'t1': 0.1, 
      't2': 0.2}, 
    'b': {'t1': 0.1, 
      't3': 0.2}} 
data = pandas.DataFrame(d) 

data.T.mean() 

=> 
t1 0.1 
t2 0.2 
t3 0.2 
dtype: float64 
+0

它是一種額外的依賴,但在高雅方面難以打敗!它是否適用於非字符串標記? –

+0

另外,數據幀總是密集的數據結構,不是嗎?如果字典數據結構很稀少,那將會對性能產生影響。 –

+0

我想這取決於你做這種東西的頻率。他們在熊貓中也實現了[稀疏數據結構](http://pandas.pydata.org/pandas-docs/stable/sparse.html)。我不確定非字符串標記。我認爲字符串和數字會很好,不知道還有什麼可以算。 – chthonicdaemon