python中所有键的平均值与给定键的匹配值

时间:2018-10-07 09:48:50

标签: python dictionary

我有一个字典,它们都有相同的键。

in_list = [{'index':1, 'value':2.}, {'index':1, 'value':3.}, {'index':2, 'value':4.}]

我想创建一个新字典,每个'value'的平均值为'index'

out_dict = {1:2.5, 2:4.}

最Python化的方式是什么?


下面的代码可以满足我的要求,但是我觉得它很笨拙

tmp = {x:[] for x in range(1,3)}
for el in in_list:
    tmp[el['index']].append(el['value'])

for key, val in tmp.iteritems():
    out_dict[key] = sum(val)/len(val)

4 个答案:

答案 0 :(得分:2)

要做到这一点而无需安装任何软件包(较长的一排线:-)):

import itertools,statistics
a = dict(zip(sorted(set([i['index'] for i in lod])),[statistics.mean(int(item['value']) for item in group) for key, group in itertools.groupby(lod, key=lambda x: x['index'])]))

现在:

print(a)

返回:

{1: 2.5, 2: 4}

如果是python 2:

import itertools
a = dict(zip(sorted(set([i['index'] for i in lod]),key=[i['index'] for i in lod].index),[sum(int(item['value']) for item in group)/len(int(item['value']) for item in group) for key, group in itertools.groupby(lod, key=lambda x: x['index'])]))

说明:

  • 使用set

  • 获取唯一元素的有序列表
  • 使用itertools.groupby进行分组,然后通过key迭代group,使用statisticssumlen来获得平均值

  • 以上两个注释都在zipdict(zip(...))

或者使代码更简洁:

Python 3:

import itertools,statistics
unique_elements=sorted(set([i['index'] for i in lod]))
groups=statistics.mean(int(item['value']) for item in group) for key, group in itertools.groupby(lod, key=lambda x: x['index'])]
a = dict(zip(unique_elements,groups))

Python 2:

import itertools
unique=sorted(set([i['index'] for i in lod])
groups=[sum(int(item['value']) for item in group)/len(int(item['value']) for item in group) for key, group in itertools.groupby(lod, key=lambda x: x['index'])]
a = dict(unique,groups))

答案 1 :(得分:2)

您的代码很好,但是您可以使其更紧凑。正如Transhuman的答案所示,您可以通过将tmp设置为列表的defaultdict来避免对其进行初始化。另一种方法是使用dict.setdefault方法。然后使用dict comprehension计算平均值。

in_list = [
    {'index':1, 'value':2.}, 
    {'index':1, 'value':3.}, 
    {'index':2, 'value':4.}
]

out_dict = {}
for d in in_list:
    out_dict.setdefault(d['index'], []).append(d['value'])
out_dict = {k: sum(v) / len(v) for k, v in out_dict.items()}
print(out_dict)

输出

{1: 2.5, 2: 4.0}

答案 2 :(得分:1)

我认为您的代码并不笨拙,但是您可以签出pandas

>>> import pandas as pd
>>> in_list = [{'index':1, 'value':2.}, {'index':1, 'value':3.}, {'index':2, 'value':4.}]
>>> 
>>> df = pd.DataFrame(in_list)
>>> df.groupby(by='index').mean()
       value
index       
1        2.5
2        4.0

如果愿意,可以将结果转换为标准词典。

>>> df.groupby(by='index').mean().to_dict()['value']
{1: 2.5, 2: 4.0}

答案 3 :(得分:1)

一种方法是使用collections.defaultdict

in_list = [{'index':1, 'value':2.}, {'index':1, 'value':3.}, {'index':2, 'value':4.}]

from collections import defaultdict
d_dict = defaultdict(list)
for k,v in [d.values() for d in in_list]:
    d_dict[k].append(v)

{k:sum(v)/len(v) for k,v in d_dict.items()}
#{1: 2.5, 2: 4.0}