【问题标题】:How to count occurrences of key in list of dictionaries如何计算字典列表中键的出现次数
【发布时间】:2018-05-22 16:44:48
【问题描述】:

我知道这是一个常见问题,但是我无法访问 Counter 模块,因为我使用的是 Python v2.6。我想计算特定键出现在字典列表中的次数。

如果我的字典是这样的:

data = [{'a':1, 'b':1}, {'a':1, 'c':1}, {'b':1, 'c':1}, {'a':1, 'c':1}, {'a':1, 'd':1}]

我如何知道“a”出现了多少次?我试过使用 len,但它只返回一个键的值的数量。

len(data['a'])

【问题讨论】:

  • 您似乎希望我们为您编写一些代码。虽然许多用户愿意为陷入困境的程序员编写代码,但他们通常只在发布者已经尝试自己解决问题时才提供帮助。展示这项工作的一个好方法是包含您迄今为止编写的代码、示例输入(如果有的话)、预期输出以及您实际获得的输出(控制台输出、回溯等)。您提供的详细信息越多,您可能收到的答案就越多。检查FAQHow to Ask
  • 你能发布你的尝试吗?
  • 我已经更新了帖子以包含我的“尝试”,我知道这是不正确的。@chrisz
  • 顺便说一句,如here 所述,Python 2.5 和 2.6 的计数器有一个 backport

标签: python python-2.x python-2.6


【解决方案1】:

您可以使用列表推导。

data = [{'a':1, 'b':1}, {'a':1, 'c':1}, {'b':1, 'c':1}, {'a':1, 'c':1}, {'a':1, 'd':1}]
sum([1 for d in data if 'a' in d])

解释: 首先从列表数据中获取字典对象,检查字典中是否存在键'a',如果存在,将1添加到列表中。然后对新列表求和。

【讨论】:

    【解决方案2】:

    您将无法访问 collections.Counter,但在 Python 2.5 中添加了 collections.defaultdict

    keys 和展平列表

    data = [j for i in data for j in i.keys()]
    
    # ['a', 'b', 'a', 'c', 'c', 'b', 'a', 'c', 'a', 'd']
    

    collections.defaultdict

    from collections import defaultdict
    dct = defaultdict(int)
    
    for key in data:
      dct[key] += 1
    
    # defaultdict(<type 'int'>, {'a': 4, 'c': 3, 'b': 2, 'd': 1})
    

    如果您只需要 a 的计数,可以使用更简单的方法来执行此操作,但这将为您提供字典列表中所有键的计数。

    【讨论】:

      【解决方案3】:

      单行解决方案可能是:

      len([k for d in data for k in d.keys() if k == 'a'])

      【讨论】:

        【解决方案4】:

        为此,您可以编写以下函数,该函数适用于您提供的结构中的数据(字典列表):

        def count_key(key,dict_list):
            keys_list = []
            for item in dict_list:
                keys_list += item.keys()
            return keys_list.count(key)
        

        然后,您可以按如下方式调用该函数:

        data = [{'a':1, 'b':1}, {'a':1, 'c':1}, {'b':1, 'c':1}, {'a':1, 'c':1}, {'a':1, 'd':1}]
        count_a = count_key('a',data)
        

        在这种情况下,count_a 将为 4。

        【讨论】:

          【解决方案5】:

          这个问题看起来很像课堂作业。这里有一段简单的代码可以完成这项工作:

          n=0
          for d in data:
             if 'a' in d:
                 n+=1
          print(n) 
          

          这里n 是一个计数器,for 循环遍历字典列表。 如果键 'a' 在字典 d 中,'a' in d 表达式将返回 true,在这种情况下,计数器 n 将递增。最后打印结果。我相信在 Python 2.6 中括号是可选的(我使用的是 3.6)。

          【讨论】:

          • 不鼓励使用纯代码的答案。你能说几句为什么这行得通,并回答 OP 的情况吗?
          猜你喜欢
          • 1970-01-01
          • 2022-11-23
          • 2016-09-23
          • 1970-01-01
          • 1970-01-01
          • 2021-12-04
          • 2022-12-04
          • 2015-09-06
          • 2022-01-10
          相关资源
          最近更新 更多