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中bisect的用法
Sep 23 Python
Python实现向QQ群成员自动发邮件的方法
Nov 19 Python
Python遍历zip文件输出名称时出现乱码问题的解决方法
Apr 08 Python
Python 通过pip安装Django详细介绍
Apr 28 Python
python根据unicode判断语言类型实例代码
Jan 17 Python
Jupyter安装nbextensions,启动提示没有nbextensions库
Apr 23 Python
python tornado微信开发入门代码
Aug 24 Python
python内置数据类型之列表操作
Nov 12 Python
django fernet fields字段加密实践详解
Aug 12 Python
pytorch 修改预训练model实例
Jan 18 Python
TensorFlow命名空间和TensorBoard图节点实例
Jan 23 Python
深入浅析pycharm中 Make available to all projects的含义
Sep 15 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中随机显示图片的函数代码
2011/06/23 PHP
解析php中如何调用用户自定义函数
2013/08/06 PHP
PHP实现自动识别Restful API的返回内容类型
2015/02/07 PHP
PHP基于mcript扩展实现对称加密功能示例
2019/02/21 PHP
Javascript 篱式条件判断
2008/08/22 Javascript
关于javascript document.createDocumentFragment()
2009/04/04 Javascript
jquery动画2.元素坐标动画效果(创建一个图片走廊)
2012/08/24 Javascript
Jquery选择子控件&quot;大于号&quot;和&quot; &quot;区别介绍及使用示例
2013/06/25 Javascript
node.js 使用ejs模板引擎时后缀换成.html
2015/04/22 Javascript
JavaScript实现Java中Map容器的方法
2016/10/09 Javascript
Node.JS中事件轮询(Event Loop)的解析
2017/02/25 Javascript
JS中showModalDialog关闭子窗口刷新主窗口用法详解
2017/03/25 Javascript
vue双花括号的使用方法 附练习题
2017/11/07 Javascript
js与jQuery实现的用户注册协议倒计时功能实例【三种方法】
2017/11/09 jQuery
Vue父子模版传值及组件传值的三种方法
2017/11/27 Javascript
微信小程序实现文字跑马灯效果
2020/05/26 Javascript
JavaScript 中定义函数用 var foo = function () {} 和 function foo()区别介绍
2018/03/01 Javascript
angular 组件通信的几种实现方式
2018/07/13 Javascript
小程序云开发之用户注册登录
2019/05/18 Javascript
[02:36]DOTA2英雄基础教程 斯拉克
2013/11/29 DOTA
[03:11]2014DOTA2国际邀请赛-VG掉入败者组 独家专访357
2014/07/19 DOTA
[15:39]教你分分钟做大人:龙骑士
2014/10/30 DOTA
详解使用pymysql在python中对mysql的增删改查操作(综合)
2017/01/18 Python
基于python log取对数详解
2018/06/08 Python
对python中array.sum(axis=?)的用法介绍
2018/06/28 Python
Python变量类型知识点总结
2019/02/18 Python
python仿抖音表白神器
2019/04/08 Python
解决TensorFlow GPU版出现OOM错误的问题
2020/02/03 Python
python中urllib.request和requests的使用及区别详解
2020/05/05 Python
过程装备与控制工程专业个人的求职信
2013/12/01 职场文书
机电专业个人求职信范文
2013/12/30 职场文书
学校青年志愿者活动总结
2015/05/06 职场文书
2016年度师德标兵先进事迹材料
2016/02/26 职场文书
vue 实现弹窗关闭后刷新效果
2022/04/08 Vue.js
Win11 BitLocker 驱动器加密
2022/04/19 数码科技
详细介绍Next.js脚手架完整搭建封装
2022/04/26 Javascript