2016-12-08 2 views
1

У меня есть ДИКТ как:Python - Найти в среднем Dict элементов

dict = [{'a':2, 'b':3}, {'b':4}, {'a':1, 'c':5}] 

мне нужно, чтобы получить среднее значение всех различных ключей. Результат должен выглядеть так:

avg = [{'a':1.5, 'b':3.5, 'c':5}] 

я могу получить сводку всех ключей, но Im не в состоянии понять, как я могу рассчитывать те же ключи, чтобы получить среднее число.

+1

Эта переменная 'dict' является' list' словарей. –

ответ

2

Вы можете создать промежуточный словарь, который собирает все встретившиеся значения в списках:

dct = [{'a':2, 'b':3}, {'b':4}, {'a':1, 'c':5}] 
from collections import defaultdict 
intermediate = defaultdict(list) 

for subdict in dct: 
    for key, value in subdict.items(): 
     intermediate[key].append(value) 

# intermediate is now: defaultdict(list, {'a': [2, 1], 'b': [3, 4], 'c': [5]}) 

И, наконец, вычислить среднее путем деления суммы каждого списка по длине каждого списка:

for key, value in intermediate.items(): 
    print(key, sum(value)/len(value)) 

, которые отпечатаны:

b 3.5 
c 5.0 
a 1.5 
1

Вы можете использовать петлю для петли с прилавком а затем разделите сумму каждого счетчиком.

Также странно, вы вызываете массив/список с Dict ...

Я хотел бы предложить что-то вроде этого:

Создать новую Dict: letter_count = {}

-Для цикл по текущим dicts

-Добавить письма к письму рассчитывать, если он не существует

-Если она действительно существует, обновить значение со значением элемента (+ = число), а также обновлять счетчик на один

-После для цикла будет сделано, разделить каждое значение счетчика

-Возвращение нового ДИКТ letter_count

+0

правый ... подобный rassar сделал – DSynergy

1

Я думал о добавлении уникальный ответ, используя PyFunctional

from functional import seq 

l = [{'a':2, 'b':3}, {'b':4}, {'a':1, 'c':5}] 
a = (seq(l) 
    # convert dictionary to list 
    .map(lambda d: seq(d).map(lambda k: (k, d[k]))) 
    .flatten() 
    # append 1 for counter 
    .map(lambda (k, v): (k, (v, 1))) 
    # sum of values, and counts 
    .reduce_by_key(lambda a, b: (a[0]+b[0], a[1]+b[1])) 
    # average 
    .map(lambda (k, (v, c)): (k, float(v)/c)) 
    # convert to dict 
    .to_dict() 
) 
print(a) 

Выход

{'a': 1.5, 'c': 5.0, 'b': 3.5} 
+0

выше для Python2. –

3

Это можно легко сделать с :

>>> import pandas 
>>> df = pandas.DataFrame([{'a':2, 'b':3}, {'b':4}, {'a':1, 'c':5}]) 
>>> df.mean() 
a 1.5 
b 3.5 
c 5.0 
dtype: float64 

Если вам нужен словарь как результат:

>>> dict(df.mean()) 
{'a': 1.5, 'b': 3.5, 'c': 5.0} 
Смежные вопросы