Python编程对列表中字典元素进行排序的方法详解


Posted in Python onMay 26, 2017

本文实例讲述了Python编程对列表中字典元素进行排序的方法。分享给大家供大家参考,具体如下:

内容目录:

1. 问题起源
2. 对列表中的字典元素排序
3. 对json进行比较(忽略列表中字典的顺序)

一、问题起源

json对象a,b

a = '{"ROAD": [{"id": 123}, {"name": "no1"}]}'
b = '{"ROAD": [{"name": "no1"}, {"id": 123}]}'

特点:a,b对应的Python的对象中键对应的键值——列表中包含着相同的字典元素,但是唯一不同的是顺序不同。如果忽略顺序,如何判断两个json是否相等。因为字典本身是自己按键排序的,列表是按加入的顺序排序的,如果对列表中的字典元素进行排序就可以轻松地排序了。如果列表中是普通的元素(不是字典),通过list(set())组合可以读列表进行排序,而列表中如果是字典元素不能使用list(set())组合,看提示:

>>> a = [{'a':1, 'b':2}, {'c':3}]
>>> a
[{'a': 1, 'b': 2}, {'c': 3}]
>>> b = set(a)
Traceback (most recent call last):
 File "<pyshell#2>", line 1, in <module>
  b = set(a)
TypeError: unhashable type: 'dict'

提示为字典是不可进行哈希操作的类型(普通非字典的元素进行哈希操作即可轻松排好序)。

那么问题的本质即:如何对列表中的字典元素排序。

二、对列表中的字典元素排序

还好,列表有sorted函数,试一下

>>> p = [{'b': 2}, {'a': 1, 'c': 3}]
>>> q = [{'a': 1, 'c': 3}, {'b': 2}]
>>> p
[{'b': 2}, {'a': 1, 'c': 3}]
>>> q
[{'a': 1, 'c': 3}, {'b': 2}]
>>> pp = sorted(p)
>>> qq = sorted(q)
>>> pp
[{'b': 2}, {'a': 1, 'c': 3}]
>>> qq
[{'b': 2}, {'a': 1, 'c': 3}]
>>> pp == qq
True
>>> p == q
False

可以看出,ok的,并且可以看出排序的原则是元素个数。

三、对json进行比较(忽略列表中字典的顺序)

import json
def compare_json(a, b):
  aa = json.loads(a)
  bb = json.loads(b)
  len_a = len(aa)
  len_b = len(bb)
  if len_a != len_b:
    return False
  else:
    for key in aa:
      if not bb.has_key(key):
        return False
      else:
        if sorted(aa[key]) != sorted(bb[key]):
          return False
  return True
if __name__ == "__main__":
  a = '{"ROAD": [{"id": 123}, {"name": "no1"}]}'
  b = '{"ROAD": [{"name": "no1"}, {"id": 123}]}'
  print compare_json(a, b)

细节:自己写json格式时,a = "{'road':1}"  json.loads(a) 错误,得写成a = '{"road:1}'  【单引号在外】

Python 相关文章推荐
Python中字典和JSON互转操作实例
Jan 19 Python
Python Web框架Flask中使用新浪SAE云存储实例
Feb 08 Python
Django用户认证系统 User对象解析
Aug 02 Python
Pandas0.25来了千万别错过这10大好用的新功能
Aug 07 Python
关于python 跨域处理方式详解
Mar 28 Python
opencv 实现特定颜色线条提取与定位操作
Jun 02 Python
python 偷懒技巧——使用 keyboard 录制键盘事件
Sep 21 Python
Python 实现3种回归模型(Linear Regression,Lasso,Ridge)的示例
Oct 15 Python
用python发送微信消息
Dec 21 Python
python定义具名元组实例操作
Feb 28 Python
python实现发送邮件
Mar 02 Python
Python学习之异常中的finally使用详解
Mar 16 Python
利用Python实现网络测试的脚本分享
May 26 #Python
python 如何快速找出两个电子表中数据的差异
May 26 #Python
详解Python3操作Mongodb简明易懂教程
May 25 #Python
python爬虫入门教程--正则表达式完全指南(五)
May 25 #Python
python爬虫入门教程--HTML文本的解析库BeautifulSoup(四)
May 25 #Python
Python win32com 操作Exce的l简单方法(必看)
May 25 #Python
python win32 简单操作方法
May 25 #Python
You might like
php curl请求信息和返回信息设置代码实例
2015/04/27 PHP
PHP下载文件的函数实例代码
2016/05/18 PHP
CI框架实现优化文件上传及多文件上传的方法
2017/01/04 PHP
Bootstrap+PHP实现多图上传功能实例详解
2018/04/08 PHP
PHP生成指定范围内的N个不重复的随机数
2019/03/18 PHP
tp5框架的增删改查操作示例
2019/10/31 PHP
Laravel统一错误处理为JSON的方法介绍
2020/10/18 PHP
ext读取两种结构的xml的代码
2008/11/05 Javascript
jquery 滚动条事件简单实例
2013/07/12 Javascript
深入分析jquery解析json数据
2014/12/09 Javascript
原生js实现日期联动
2015/01/12 Javascript
AngularJS中的Directive自定义一个表格
2016/01/25 Javascript
AngularJs 弹出模态框(model)
2016/04/07 Javascript
解决vue做详情页跳转的时候使用created方法 数据不会更新问题
2020/07/24 Javascript
python操作MySQL数据库的方法分享
2012/05/29 Python
python抓取豆瓣图片并自动保存示例学习
2014/01/10 Python
python网络编程之读取网站根目录实例
2014/09/30 Python
列举Python中吸引人的一些特性
2015/04/09 Python
Django框架中处理URLconf中特定的URL的方法
2015/07/20 Python
python实现汉诺塔方法汇总
2016/07/25 Python
Django实现支付宝付款和微信支付的示例代码
2018/07/25 Python
[原创]Python入门教程1. 基本运算【四则运算、变量、math模块等】
2018/10/28 Python
树莓派4B+opencv4+python 打开摄像头的实现方法
2019/10/18 Python
python爬虫之遍历单个域名
2019/11/20 Python
解决Pytorch 加载训练好的模型 遇到的error问题
2020/01/10 Python
python数字类型math库原理解析
2020/03/02 Python
ipython jupyter notebook中显示图像和数学公式实例
2020/04/15 Python
python如何写try语句
2020/07/14 Python
法国在线宠物店:zooplus.fr
2018/02/23 全球购物
市场开发与营销专业求职信
2013/12/31 职场文书
高中生学期学习自我评价
2014/02/24 职场文书
竞争上岗演讲稿范文
2014/05/12 职场文书
质量主管工作职责
2014/09/26 职场文书
运动会宣传稿50字
2015/07/23 职场文书
Vue CLI中模式与环境变量的深入详解
2021/05/30 Vue.js
SQL Server使用PIVOT与unPIVOT实现行列转换
2022/05/25 SQL Server