在python中通过平均值生成dict


keys = ['a', 'a' ,'a' ,'b' ,'b' ,'c']
values = [2, 4, 6, 6, 4 ,3]

这里可以保证len(keys)==len(values)。您还可以假设键是排序的。我想创建一个字典,其中新值将是旧值的平均值。如果我做

x = dict(zip(keys, values)) # {'a': 3, 'b': 4, 'c': 3}

这里的新值不是旧值的平均值。我期待类似

的内容
{'a': 4, 'b': 5, 'c': 3}

我可以通过将每个旧值加起来,除以相应的键出现次数来实现这一点,但我认为可能有一个更优雅的解决方案。任何想法都会很感激!

编辑:所谓平均值,我的意思是:bkeys中出现两次,其值为64。在新字典中,它的值为5

我认为最干净的解决方案是你建议的-按键分组,用长度求和和除。我想基于数据框架的解决方案可能会更快,但我真的不认为这是足够的用途来证明额外的外部库。

from collections import defaultdict
keys = ['a', 'a' ,'a' ,'b' ,'b' ,'c']
values = [2, 4, 6, 6, 4 ,3]
groups = defaultdict(list)
for k, v in zip(keys, values):
groups[k].append(v)
avgs = {k:sum(v)/len(v) for k, v in groups.items()}
print(avgs) # {'a': 4.0, 'b': 5.0, 'c': 3.0}

参考Pandas解决方案:

import pandas
keys = ['a', 'a' ,'a' ,'b' ,'b' ,'c']
values = [2, 4, 6, 6, 4 ,3]
df = pandas.DataFrame(zip(keys, values))
print(df.groupby(0).mean())

如果键已经排序,则可以使用itertools.groupby:

from itertools import groupby
from statistics import mean
from operator import itemgetter
keys = ['a', 'a' ,'a' ,'b' ,'b' ,'c']
values = [2, 4, 6, 6, 4 ,3]
{k: mean(map(itemgetter(1), g)) for k, g in groupby(zip(keys, values), itemgetter(0))}

这回报:

{'a': 4, 'b': 5, 'c': 3}

相关内容

  • 没有找到相关文章

最新更新