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

按值对json的python排序列表
EN

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

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

示例JSON文件:

代码语言:javascript
运行
AI代码解释
复制
{ "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
运行
AI代码解释
复制
{ "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
运行
AI代码解释
复制
#!/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 07:18:49

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

代码语言:javascript
运行
AI代码解释
复制
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 07:19:38

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

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

示例:

代码语言:javascript
运行
AI代码解释
复制
>>> 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 07:21:34

代码语言:javascript
运行
AI代码解释
复制
# 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

复制
相关文章
控制名称空间的使用
如将对象投射到XML中所述,可以将类分配给名称空间,以便相应的XML元素属于该名称空间,还可以控制类的属性是否也属于该名称空间。
用户7741497
2022/07/04
1.1K0
lxml基本用法_XML是什么
lxml库结合libxml2快速强大的特性,使用xpath语法来进行文件格式解析,与Beautiful相比,效率更高。
全栈程序员站长
2022/11/15
7320
lxml基本用法_XML是什么
名称空间
using 声明和using 编译指令 using 声明将特定的名称添加到它所属的声明区域中。 using std::cout; 将cout添加到声明区中,声明扣可以用cout<<代替 std::cout<< int main() {   using std::cout;   cout<<"a";   std::cin.get(); } using声明使一个名称可用,而using 编译指令使所有的名称都可以用。 using namespace std; int main() {   cout<<"aa";
lpxxn
2018/01/31
1.9K0
python的lxml模块解析xml
IBM Research Report, San Jose, California RJ909 August 1971
kirin
2021/04/01
1K0
名称空间namespace
结构:例子:创建名为Jack的名称空间namespace Jack {int pal;void fetch();//可在后面再次使用名称空间定义函数struct Well{...};...}提供函数定义namesoace Jack{void fetch(){...}}访问命名空间:Jack::pal=12;Jack::Well mode; //创建Well结构类型元素modeJAck::fetch();------特征:可以全局,也可以位于另一个名称空间中,但不能在代码块中任何名称空间中的名称都不会与其他名
Alan_1
2023/04/30
9890
11-TypeScript中的名称空间
在后端开发语言中,比如C#中,可以将不同源代码文件中的代码通过名称空间组合到一起。一般一个类定义在一个源代码文件中,在功能上属于一个上下文的源代码文件通过名称空间进行组织。 在TypeScript中,可以将多个ts文件组织到一个名称空间中,这样调用方就可以使用名称空间和类名完成调用。在TypeScript中,通过module关键字定义名称空间,另外要通过名称空间完成成员 的访问,成员必须指定export关键字。 ts文件一: module Hys{ export class Doctor{
用户1910585
2018/05/04
1.1K0
Spring使用p名称空间配置属性
Spring的p标签是基于XML Schema的配置方式,目的是为了简化配置方式。
大黄大黄大黄
2018/09/14
9560
Spring使用p名称空间配置属性
lxml网页抓取教程
在本教程中,我们会学习lxml库和创建XML文档的基础知识,然后会处理XML和HTML文档。最后,我们将利用以上所学,融会贯通,看看如何使用lxml提取数据。本教程的每一步都配有实用的Python lxml示例。
用户7850017
2021/10/15
4.1K0
lxml网页抓取教程
JavaScript 解析 XML 时如何通过名称直接取到值?
同级的Attribute,有没有办法通过类似于 getXXXByName("aa") 得到0, getXXXByName("bb") 得到1呢?
阿敏总司令
2019/02/28
7320
Python-数据解析-lxml库-下
ElementTree 类中附带了一个类似于 XPath 路径语言的 ElementPath 类。
小团子
2019/07/18
6760
Python-数据解析-lxml库-下
如何在PHP中解析XML
XML解析器是一个程序,它可以将XML文档或代码转换为XML文档对象模型(DOM)对象。
Lemon黄
2020/07/07
3.7K0
关于带命名空间的中文XML的解析
本来感觉XML文件解析是一件很简单的事情,结果折腾了一两周没什么进展,直到昨天才陆陆续续找到了一些解决方案,现在把踩坑过程和解决过程一并叙说一遍。
python与大数据分析
2022/03/11
7170
spring开发_使用p名称空间配置属性
http://www.cnblogs.com/hongten/gallery/image/112563.html
Hongten
2018/09/13
4780
Could not find a version that satisfies the requirement lxml解决方法
今天ytkah在安装lxml时提示错误ERROR: Could not find a version that satisfies the requirement lxml (from versions: none),ERROR: No matching distribution found for lxml,升级一下pip试试
ytkah
2020/02/25
5.6K0
Could not find a version that satisfies the requirement lxml解决方法
Python 爬虫工具
Python3 默认提供了urllib库,可以爬取网页信息,但其中确实有不方便的地方,如:处理网页验证和Cookies,以及Hander头信息处理。 为了更加方便处理,有了更为强大的库 urllib3
Python知识大全
2020/02/13
1.5K0
Python 爬虫工具
X--名称空间详解
X名称空间里面的成员(如X:Name,X:Class)都是写给XAML编译器看的、用来引导XAML代码将XAML代码编译为CLR代码。
莫问今朝
2018/08/31
1.5K0
X--名称空间详解
名称空间与作用域
函数内部的函数只能在函数内部调用,不能在函数外部调用,通过接下来的学习你将会知道为什么会出现这种情况。
py3study
2020/01/16
3990
名称空间与作用域
在Excel中处理和使用地理空间数据(如POI数据)
因为不是所有规划相关人员,都熟悉GIS软件,或者有必要熟悉GIS软件,所以可能我们得寻求另一种方法,去简单地、快速地处理和使用地理空间数据——所幸,我们可以通过Excel自带的“三维地图”功能来简单满足一些差不多够用的需求。
Sidchen
2020/08/02
11.3K0
Beautiful Soup与运用(猫眼电影榜单)
Beautiful Soup是Python的一个HTML/XML的解析库,可以用来获取网页信息 输入文档为Unicode 编码,输出文档为UTF-8编码,不需考虑编码问题
机器视觉CV
2019/07/15
5410
点击加载更多

相似问题

lxml和xml名称空间--使用find和findall获取XML标记值。

12

使用findall,Lxml迭代Xml

20

使用lxml解析python中的多个名称空间XML

11

使用lxml解析具有多个名称空间的xml

11

如何使用lxml将名称空间包含到xml文件中?

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档