如何在python中计算dict中最常见的前10个值

如何在python中计算dict中最常见的前10个值,python,python-2.7,csv,counter,Python,Python 2.7,Csv,Counter,我对python和编程基本上是新手,所以请友好一点。我正在尝试分析一个包含音乐信息的csv文件,并返回前n个收听最多的乐队。从下面的代码中可以看出,每首歌曲都是列表中的一个dict条目,格式如下: [{'album': 'Exile on Main Street', 'song': 'Happy', 'datetime': '3 Dec 2014 14:08', 'artist': 'The Rolling Stones'}, {'album': 'II', 'song': 'Black Dog

我对python和编程基本上是新手,所以请友好一点。我正在尝试分析一个包含音乐信息的csv文件,并返回前n个收听最多的乐队。从下面的代码中可以看出,每首歌曲都是列表中的一个dict条目,格式如下:

[{'album': 'Exile on Main Street', 'song': 'Happy', 'datetime': '3 Dec 2014 14:08', 'artist': 'The Rolling Stones'}, {'album': 'II', 'song': 'Black Dog', 'datetime': '1 Dec 2014 08:08', 'artist': 'Led Zepplin'}]

from collections import Counter

def count_artist_plays(filename):
    with open(filename, 'r') as data:
        header = data.readline().strip().split(',')

        entries = []
        for line in data:
            entry = line.strip().split(',')
            listens = {}
            for info, type in enumerate(header):
                listens[type] = entry[info]

            entries.append(listens)

    for d in entries:
        arts = d['artist']
        c = Counter(arts)
        print c.most_common(10)
如何获得最常见的字符串(带),而不是下面的字符分解?

[('s', 2), ('a', 1), (' ', 1), ('E', 1), ('l', 1), ('o', 1), ('n', 1), ('S', 1), ('v', 1), ('y', 1)]

初始化计数器一次,让关键点成为艺术家,并通过循环每次增加一个关键点(艺术家):

c = Counter()
for d in entries:
    arts = d['artist']
    c[arts] += 1
print(c.most_common(10))
arts
是字符串时,则
c=Counter(arts)
arts
中的字符进行计数:

In [522]: collections.Counter('Led Zepplin')
Out[522]: Counter({'e': 2, 'p': 2, ' ': 1, 'd': 1, 'i': 1, 'L': 1, 'l': 1, 'n': 1, 'Z': 1})
相比之下:

In [523]: c = collections.Counter()

In [524]: c['Led Zepplin'] += 1

In [525]: c['The Rolling Stones'] += 1

In [526]: c.most_common()
Out[526]: [('Led Zepplin', 1), ('The Rolling Stones', 1)]

或者,正如Jon Clements指出的那样,建立一份所有艺术家的名单,然后数一数:

c = Counter(d['artist'] for d in entries)
print(c.most_common(10))

请注意,上面使用的是避免构建(可能)大型临时列表,同时具有更简洁易读的语法。

或只是
计数器(el['artist']表示el in条目)。最常见的(10)
如果您将其作为gen exp而不是列表comp保存,那么您就不会担心内存问题。。。