Сортировка данных JSON по значению ключей
В настоящее время я получаю данные JSON из API Discogs (данные тега 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
2 ответа
Вы можете использовать список-понимание и 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
определение будет в основном делать entry.get('year', None)
за каждую запись в json_object['results']
, давая sorted
метод значение для сортировки.
Вы не должны использовать readlines()
чтобы прочитать ваш ответ JSON, он неправильно интерпретирует переводы строк. Пусть json
библиотека делает чтение вместо (обратите внимание на .load()
нет s
в конце):
response = urllib2.urlopen(request)
json_object = json.load(response)