按键值排序JSON数据

2024-05-18 08:19:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在从discogs API(mp3标签数据)中获取JSON数据,并希望按键的值对结果进行排序。在这个例子中,我试图得到一首歌的数据,它的输出是1988年的第一首,而数据实际上是1987年的记录。如何对这些数据进行排序,以便按年份(olderst到newest)获取排序的数据。下面的代码按键或值排序,但这不是我想要得到的。请帮忙。

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

Tags: 数据importaddjsonforrawobjectdiscogs
2条回答

您可以使用list comprehension和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)

相关问题 更多 >