2014-01-09 43 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