【问题标题】:Count elements in a list against a list of possible values根据可能值列表计算列表中的元素
【发布时间】:2020-01-26 17:17:21
【问题描述】:

我有一个列表如下:

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}

我尝试过收藏:

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

如何将选项列表传递给此函数或其他函数?

【问题讨论】:

    标签: python list counter


    【解决方案1】:

    您可以使用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))
    

    【讨论】:

    • “**”代表什么?
    • @LuisRamonRamirezRodriguez 是字典解包。请参阅python.org/dev/peps/pep-0448 它在 3.5 或更高版本中可用(我认为)。
    【解决方案2】:

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

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

    Counter 对象有一个字典接口,只是它们为丢失的项目返回零计数,而不是引发 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])
    

    【讨论】:

    • 试试{k: counter[k] for k in possible_keys}
    【解决方案3】:

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

    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}
    

    【讨论】:

      【解决方案4】:

      我会使用 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}
      

      【讨论】:

        猜你喜欢
        • 2021-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-14
        • 1970-01-01
        • 2013-12-02
        • 1970-01-01
        相关资源
        最近更新 更多