6

現在、discogs APIからJSONデータ(mp3タグデータ)を取得しており、結果をキーの値で並べ替えたいと考えています。この場合、Guns n Rosesの曲のデータを取得しようとしていますが、出力には最初の1988が含まれていますが、データには実際には1987年のレコードが含まれています。このデータを並べ替えて、並べ替えられたデータを取得するにはどうすればよいですか。年(古いものから新しいものへ)。以下のコードはキーまたは値のいずれかでソートされていますが、それは私が意図したものではありません。助けてください。

import json
import urllib2
request = urllib2.Request('http://api.discogs.com/database/search?sort=year&sort_order=asc&artist=%22Guns+N%27+Roses%22&track=%22Sweet+Child+O%27+Mine%22&format_exact=Album&type=master')
request.add_header('User-Agent','Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)')
request.add_header('Content-Type','application/json')
response = urllib2.urlopen(request)
json_raw= response.readlines()
json_object = json.loads(json_raw[0])



for row in json_object['results']:
    try:
        from operator import itemgetter
        for k, v in sorted(row.items(), key=itemgetter(0)):
            print k, v
    except KeyError: 
        pass
4

2 に答える 2

13

これには、リスト内包表記とsorted()関数を使用できます。

# filter  json_object['results']  first, as some of the items are missing the key 'year'

In [33]: results = [x for x in json_object['results'] if 'year' in x]

In [34]: sorted(results, key=lambda x: x['year'])

また :

In [79]: from operator import itemgetter

In [80]: sorted(results, key=itemgetter('year'))
于 2012-11-18T08:39:20.783 に答える
1

辞書のリストを並べ替えるには、methodcaller並べ替えるキーとともにaを使用します。含まれている辞書ではなく、結果リストを並べ替えます。さらに、一部のエントリには1年がないため、エラーが発生する可能性があります

from operator import methodcaller

for row in sorted(json_object['results'], key=methodcaller('get', 'year', None)):
    # process the row dictionary

methodcaller定義は基本的に、のentry.get('year', None)各エントリに対してを実行し、メソッドにソートする値をjson_object['results']与えます。sorted

JSON応答の読み取りには使用しないでくださいreadlines()。改行が誤って解釈されます。代わりにライブラリに読み取りを行わせます(最後に、noにjson注意してください)。.load()s

response = urllib2.urlopen(request)
json_object = json.load(response)
于 2012-11-18T08:29:49.943 に答える