web-dev-qa-db-ja.com

pythonのdictで最も一般的な上位10個の値をカウントする方法

私は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)]
11
mo_shun

カウンターを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))
_

上記では、(おそらく)大きな一時リストの作成を回避するために ジェネレータ式 を使用し、同時に、はるかに簡潔で読みやすい構文を使用していることに注意してください。

17
unutbu