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}
我可以通过将每个旧值加起来,除以相应的键出现次数来实现这一点,但我认为可能有一个更优雅的解决方案。任何想法都会很感激!
编辑:所谓平均值,我的意思是:b
在keys
中出现两次,其值为6
和4
。在新字典中,它的值为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}