从两个列表创建字典?取平均值时?

Sam*_*ton 2 python dictionary list count python-3.x

stackoverflow 的向导,

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

如果有这些清单

  keys = ['a', 'a', 'b', 'c']
values = [6, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

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

a_dict = {'a' : 4, 'b' : 3, 'c' : 4}
Run Code Online (Sandbox Code Playgroud)

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

And*_*ely 8

一个简单的解决方案(感谢@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)
Run Code Online (Sandbox Code Playgroud)

印刷:

{'a': 4.0, 'b': 3.0, 'c': 4.0}
Run Code Online (Sandbox Code Playgroud)

如果你想要键数,你可以做例如:

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)
Run Code Online (Sandbox Code Playgroud)

印刷:

{'a': (4.0, 2), 'b': (3.0, 1), 'c': (4.0, 1)}
Run Code Online (Sandbox Code Playgroud)

其中 values 的第二个元素是键的计数。


解决方案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)
Run Code Online (Sandbox Code Playgroud)

印刷:

{'a': 4, 'b': 3, 'c': 4}
Run Code Online (Sandbox Code Playgroud)

  • 我会使用 dict comp 而不是奇怪的列表转换和 `pop` 东西...只需 `out = {key: sum(value) / len(value) for key, value in out.items()}` (3认同)
  • @DeepSpace 是的,你有权利。我编辑了我的答案(也用 itertools 放了一个)。谢谢! (2认同)