Сортировка данных 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)
Другие вопросы по тегам