如何计算dicts列表中特定dict键的出现次数

时间:2014-12-12 01:51:44

标签: python python-2.7 dictionary count

我正在尝试计算指定键出现在我的dicts列表中的次数。我已使用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]

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

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

3 个答案:

答案 0 :(得分:5)

您可以将其解压缩,将其放入列表中,然后计算列表的长度。

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

第三次修改:如果您对理解或生成器不满意,或者您觉得增强了代码可读性,那么您也可以循环播放

n = 0  # number of artists

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

答案 1 :(得分:1)

您可以将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-loop的可读性。

答案 2 :(得分:0)

如果您的意思是计算密钥而不是特定密钥的不同值,则不使用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