首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >按值对json的python排序列表

按值对json的python排序列表
EN

Stack Overflow用户
提问于 2014-11-14 15:14:32
回答 4查看 112K关注 0票数 48

我有一个由JSON组成的文件,每个一行,并希望按update_time颠倒排序文件。

示例JSON文件:

代码语言:javascript
复制
{ "page": { "url": "url1", "update_time": "1415387875"}, "other_key": {} }
{ "page": { "url": "url2", "update_time": "1415381963"}, "other_key": {} }
{ "page": { "url": "url3", "update_time": "1415384938"}, "other_key": {} }

想要输出:

代码语言:javascript
复制
{ "page": { "url": "url1", "update_time": "1415387875"}, "other_key": {} }
{ "page": { "url": "url3", "update_time": "1415384938"}, "other_key": {} }
{ "page": { "url": "url2", "update_time": "1415381963"}, "other_key": {} }

我的代码:

代码语言:javascript
复制
#!/bin/env python
#coding: utf8

import sys
import os
import json
import operator

#load json from file
lines = []
while True:
    line = sys.stdin.readline()
    if not line: break
    line = line.strip()
    json_obj = json.loads(line)
    lines.append(json_obj)

#sort json
lines = sorted(lines, key=lambda k: k['page']['update_time'], reverse=True)

#output result
for line in lines:
    print line

该代码可以很好地处理示例JSON文件,但是如果JSON没有'update_time',它将引发KeyError异常。是否有无例外的方法可以做到这一点?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-11-14 15:18:49

编写一个使用try...except处理KeyError的函数,然后将其用作key参数,而不是您的lambda。

代码语言:javascript
复制
def extract_time(json):
    try:
        # Also convert to int since update_time will be string.  When comparing
        # strings, "10" is smaller than "2".
        return int(json['page']['update_time'])
    except KeyError:
        return 0

# lines.sort() is more efficient than lines = lines.sorted()
lines.sort(key=extract_time, reverse=True)
票数 43
EN

Stack Overflow用户

发布于 2014-11-14 15:19:38

您可以使用具有默认值的dict.get()

代码语言:javascript
复制
lines = sorted(lines, key=lambda k: k['page'].get('update_time', 0), reverse=True)

示例:

代码语言:javascript
复制
>>> lines = [
...     {"page": {"url": "url1", "update_time": "1415387875"}, "other_key": {}},
...     {"page": {"url": "url2", "update_time": "1415381963"}, "other_key": {}},
...     {"page": {"url": "url3", "update_time": "1415384938"}, "other_key": {}},
...     {"page": {"url": "url4"}, "other_key": {}},
...     {"page": {"url": "url5"}, "other_key": {}}
... ]
>>> lines = sorted(lines, key=lambda k: k['page'].get('update_time', 0), reverse=True)
>>> for line in lines:
...     print line
... 
{'other_key': {}, 'page': {'url': 'url1', 'update_time': '1415387875'}}
{'other_key': {}, 'page': {'url': 'url3', 'update_time': '1415384938'}}
{'other_key': {}, 'page': {'url': 'url2', 'update_time': '1415381963'}}
{'other_key': {}, 'page': {'url': 'url4'}}
{'other_key': {}, 'page': {'url': 'url5'}}

不过,我仍然会遵循费迪南德建议的EAFP principle -这样你也可以处理page密钥丢失的情况。让它失败并处理它要比检查各种转角情况容易得多。

票数 29
EN

Stack Overflow用户

发布于 2014-11-14 15:21:34

代码语言:javascript
复制
# sort json
lines = sorted(lines, key=lambda k: k['page'].get('update_time', 0), reverse=True)
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26924812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档