我目前正在从discogs API(mp3标签数据)获取JSON数据,并希望按键的值对结果进行排序。在这种情况下,我正在尝试获取 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
你可以为此使用列表理解和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'))
要对词典列表进行排序,请使用带有排序键的methodcaller
;您希望对结果列表进行排序,而不是对包含的词典进行排序。此外,有些条目没有年份,这可能会导致错误:
from operator import methodcaller
for row in sorted(json_object['results'], key=methodcaller('get', 'year', None)):
# process the row dictionary
methodcaller
定义基本上会为json_object['results']
中的每个条目做一个entry.get('year', None)
,给sorted
方法排序的值。
您不应该使用 readlines()
来读取 JSON 响应,它会错误地解释换行符。让json
库代替读取(注意.load()
,最后没有s
):
response = urllib2.urlopen(request)
json_object = json.load(response)