按键值对 JSON 数据进行排序
Posted
技术标签:
【中文标题】按键值对 JSON 数据进行排序【英文标题】:Sorting JSON data by keys value 【发布时间】:2012-11-06 11:25:35 【问题描述】:我目前正在从 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
【问题讨论】:
如果您提供 JSON 数据样本,我会提供帮助。 从外观上看,您使用的是this API。 【参考方案1】:您可以为此使用 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'))
【讨论】:
比你,这就像一个魅力,正如你所知,我是一个新手,还有很长的路要走..【参考方案2】:要对字典列表进行排序,请使用methodcaller
和要排序的键;您想对 results 列表进行排序,而不是对包含的字典进行排序。此外,有些条目没有一年,这可能会导致错误:
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)
【讨论】:
我是这个论坛的新手,我无法发布 JSON,因为它说我还剩几个字符要发布... 查看How do I format my code blocks? 以获得更多帮助。 我不确定我做错了什么,但是当我现在运行这个时,我得到一个错误: C:\Python27>python test2.py Traceback(最近一次调用最后):文件“test2.py”,第 11 行,在以上是关于按键值对 JSON 数据进行排序的主要内容,如果未能解决你的问题,请参考以下文章