【问题标题】:How to count occurrences of specific dict key in list of dicts如何计算字典列表中特定字典键的出现次数
【发布时间】:2014-12-12 01:51:43
【问题描述】:

我正在尝试计算指定键在我的字典列表中出现的次数。我已经使用Counter()most_common(n) 来计算所有键,但是如何找到特定键的计数?我有这段代码,目前无法使用:

def Artist_Stats(self, artist_pick):

    entries = TopData(self.filename).data_to_dict()

    for d in entries:
        x = d['artist']
        find_artist = Counter()
        print find_artist[x][artist_pick]

“条目”数据大约有 60k 条目,如下所示:

[{'album': 'Nikki Nack', 'song': 'Find a New Way', 'datetime': '2014-12-03 09:08:00', 'artist': 'tUnE-yArDs'},]

【问题讨论】:

    标签: python python-2.7 dictionary count


    【解决方案1】:

    你可以把它提取出来,放到一个列表中,然后计算列表的长度。

    key_artists = [k['artist'] for k in entries if k.get('artist')]
    len(key_artists)
    

    编辑:如果您的数据很大,使用生成器表达式可能会更好:

    key_artists = (1 for k in entries if k.get('artist'))
    sum(key_artists)
    

    第二次编辑

    对于特定的艺术家,您可以将 if k.get('artist') 替换为 if k.get('artist') == artist_pick

    第 3 次编辑:如果您对推导式或生成器不满意,或者您觉得这样可以提高代码的可读性,您也可以循环使用

    n = 0  # number of artists
    
    for k in entries:
      n += 1 if k.get('artist') == artist_pick else 0
    

    【讨论】:

    • 这可能是一个愚蠢的问题,但是我要插入我正在寻找的特定键/艺术家的位置在哪里(比如 def 行中的 'artist_pick')?我一直在盯着这个,但我没有看到它。提前致谢!
    • 非常感谢!我仍然需要大量练习阅读一行表达式/理解。
    【解决方案2】:

    您可以将Counter 对象与+ 一起添加。下面是一个演示:

    >>> from collections import Counter
    >>> data = [{'a':1, 'b':1}, {'a':1, 'c':1}, {'b':1, 'c':1}, {'a':1, 'c':1}, {'a':1, 'd':1}]
    >>> counter = Counter(data[0])
    >>> for d in data[1:]:
    ...     counter += Counter(d)
    ...
    >>> counter
    Counter({'a': 4, 'c': 3, 'b': 2, 'd': 1})
    >>> counter['a']  # Count of 'a' key
    4
    >>> counter['d']  # Count of 'd' key
    1
    >>>
    

    或者,如果你想变得花哨,用 sum 和生成器表达式替换 for 循环:

    >>> from collections import Counter
    >>> data = [{'a':1, 'b':1}, {'a':1, 'c':1}, {'b':1, 'c':1}, {'a':1, 'c':1}, {'a':1, 'd':1}]
    >>> counter = sum((Counter(d) for d in data[1:]), Counter(data[0]))
    >>> counter
    Counter({'a': 4, 'c': 3, 'b': 2, 'd': 1})
    >>>
    

    我个人更喜欢 for 循环的可读性。

    【讨论】:

      【解决方案3】:

      如果您的意思是计算键而不是特定键的不同值,那么不用Counter()

      artist_key_count = 0
      for track in entries:
          if 'artist' in track.keys():
              artist_key_count += 1
      

      如果您要计算每个艺术家出现在您的曲目列表中的次数,您也可以不使用Counter()

      artist_counts = {}
      for track in entries:
          artist = track.get('artist')
          try:
              artist_counts[artist] += 1
          except KeyError:
              artist_counts[artist] = 1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-23
        • 1970-01-01
        • 2016-09-23
        • 1970-01-01
        • 2021-12-04
        • 1970-01-01
        • 2015-09-06
        • 2022-12-04
        相关资源
        最近更新 更多