根据可能值列表对列表中的元素进行计数

Count elements in a list against a list of possible values

我有一个列表如下:

a = [50, 75, 75, 100, 50, 50, 75, 50, 75]

可能的值为:0、25、50、75 和 100

从那里我想将字典中的值分组为:

result= {'0':0,'25':0,'50':4,'75':4,'100':1}

我试过collections:

import collections
a = [50, 75, 75, 100, 50, 50, 75, 50, 75]
counter=collections.Counter(a)

但结果:

Counter({50: 4, 75: 4, 100: 1})

不考虑:'0':0,'25':0

如何将选项列表传递给这个或另一个函数?

您可以使用 dict.fromkeys() 创建默认值为 0 的空字典,然后将其与 Counter() 输出合并:

from collections import Counter

a = [50, 75, 75, 100, 50, 50, 75, 50, 75]
possible =[0,25,50,75, 100]

{**dict.fromkeys(possible, 0), **Counter(a)}
# {0: 0, 25: 0, 50: 4, 75: 4, 100: 1}

d = dict.fromkeys(possible, 0)
d.update(Counter(a))

对于我提出的解决方案,您需要定义一个包含所有可能键(在您的情况下为整数)的列表(或其他类型的可迭代对象)。

您可以构建一个新的 dict,为您在 counter 中找不到的键分配值 0。在这里我们可以使用 collections.Counter 的一个很好的 属性 说(感谢@MykolaZotko 指出):

Counter objects have a dictionary interface except that they return a zero count for missing items instead of raising a KeyError.

所以代码可以是:

import collections
possible_keys = [0, 25, 50, 75, 100]

data = [50, 75, 75, 100, 50, 50, 75, 50, 75]
counter = collections.Counter(data)

我们可以创建一个新的 dict,其中缺少的元素为零:

dict_with_zeros = {
    k: counter[k]
    for k in possible_keys}

或者,如果您只需要打印计数器而不用实际创建一个带有零的新 dict

for k in possible_keys:
    print(k, counter[k])

我会用 dict-comprehension 的方式来做到这一点:

a = [50, 75, 75, 100, 50, 50, 75, 50, 75]
possible = [0,25,50,75,100]
result = {p:0 for p in possible}
for i in a:
    result[i] += 1
print(result)  # {0: 0, 25: 0, 50: 4, 75: 4, 100: 1}

您可以使用这些值创建一个新字典,无需像这样的额外导入:

a = [50, 75, 75, 100, 50, 50, 75, 50, 75]
required = [0,25,50,75,100]

result = {item:a.count(item) for item in required}

这是一个dictionary comprehension;它创建 required 中存在的所有键并计算它们在 a 中出现的次数(如果有的话)。 result 将包含

{0: 0, 25: 0, 50: 4, 75: 4, 100: 1}