2014-01-09 2 views
-1

У меня есть ДИКТ, как показано ниже:Как получить среднее значение от dict, как показано ниже?

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

Кроме того, dataframe всегда является плотной структурой данных, нет? Это может иметь последствия для производительности, если диктофонная структура является редкой. –

+0

Я полагаю, это зависит от того, как часто вы делаете такие вещи. Они реализовали [редкие структуры данных] (http://pandas.pydata.org/pandas-docs/stable/sparse.html) в пандах. Я не уверен в токенах, отличных от строки. Я думаю, что строки и цифры будут в порядке, не уверены, что еще будет считать. – chthonicdaemon

Смежные вопросы