首页 > 解决方案 > 从两个列表创建字典?在取平均值的同时?

问题描述

stackoverflow的奇才,

我希望结合两个列表来创建一个字典,我使用了 dict & zip,但是它不符合我的要求。

如果有这些清单

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

我希望字典能够反映平均值,以便输出为:

a_dict = {'a' : 4, 'b' : 3, 'c' : 4}

作为奖励但不是必需的,如果可能的话,是否有办法计算每个重复项?即输出后跟“a”被计算了两次,而不仅仅是在键中进行计数。

标签: pythonpython-3.xlistdictionarycount

解决方案


一个简单的解决方案(感谢@DeepSpace 的 dict-comprehension 建议):

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

out = {}
for k, v in zip(keys, values):
    out.setdefault(k, []).append(v)

out = {key: sum(value) / len(value) for key, value in out.items()}

print(out)

印刷:

{'a': 4.0, 'b': 3.0, 'c': 4.0}

如果您想要键数,您可以执行以下操作:

out = {}
for k, v in zip(keys, values):
    out.setdefault(k, []).append(v)

out = {key: (sum(value) / len(value), len(value)) for key, value in out.items()}

print(out)

印刷:

{'a': (4.0, 2), 'b': (3.0, 1), 'c': (4.0, 1)}

值的第二个元素是键的计数。


解决方案itertools(如果键已排序):

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

from itertools import groupby
from statistics import mean

out = {}
for k, g in groupby(zip(keys, values), lambda k: k[0]):
    out[k] = mean(v for _, v in g)

print(out)

印刷:

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

推荐阅读