2018年08月29日

言語処理100本ノックでPython入門 #68 - MongoDBでソート

  

今日は、言語処理100本ノック 2015の第7章・問題68に挑戦です。


■ 問題
68. ソート
"dance"というタグを付与されたアーティストの中でレーティングの投票数が多いアーティスト・トップ10を求めよ.

■ Pythonのコード
import json
import pymongo

def findDance():
    client = pymongo.MongoClient('localhost', 27017)
    db = client['MusicBrainzDb']
    co = db['artists']
    return co.find({'tags.value': 'dance'}).sort('rating.count', pymongo.DESCENDING)

def main():
    for d in findDance()[0:10]:
        print(f'{} - {}'.format(d['name'], d['rating']['count']))
        #print(f'{d['name']} - {d['rating']['count']}')

if __name__ == '__main__':
    main()

■ ちょと説明

まずは、検索ですが、以下のようにオブジェクトを引数に渡して検索することができます。

co.find({'tags.value': 'dance'})
面白いですね。
そして、以下のように、ドットで繋げてsortすることができます。
co.find({'tags.value': 'dance'}).sort('rating.count', pymongo.DESCENDING)

pymongo.DESCENDINGを指定しているので、降順にソートしています。

取得したオブジェクトの各値にアクセスするには、辞書型なので、d['name']のように書けば、値を取得できます。階層構造になっている場合は、

d['rating']['count'])

のようにアクセスします。

これを使って、結果を以下のコードで画面に表示しています。

print('{} - {}'.format(d['name'], d['rating']['count']))

■ 結果
Madonna - 26
Bjork - 23
The Prodigy - 23
Rihanna - 15
Britney Spears - 13
Maroon 5 - 11
Adam Lambert - 7
Fatboy Slim - 7
Basement Jaxx - 6
Cornershop - 5