我有一个字典,它们都有相同的键。
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)
答案 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
,使用statistics
或sum
和len
来获得平均值
以上两个注释都在zip
(dict(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}