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使用Socket(Https)Post登录百度的实现代码
May 18 Python
python端口扫描系统实现方法
Nov 19 Python
python中使用xlrd、xlwt操作excel表格详解
Jan 29 Python
Python方法的延迟加载的示例代码
Dec 18 Python
Python3 log10()函数简单用法
Feb 19 Python
Kali Linux安装ipython2 和 ipython3的方法
Jul 11 Python
对Pytorch中Tensor的各种池化操作解析
Jan 03 Python
解决Tensorboard 不显示计算图graph的问题
Feb 15 Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
Apr 01 Python
python在一个范围内取随机数的简单实例
Aug 16 Python
Python虚拟环境virtualenv是如何使用的
Jun 20 Python
Python利用FlashText算法实现替换字符串
Mar 31 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 Static关键字实用方法
2010/06/04 PHP
PHP封装的一个支持HTML、JS、PHP重定向的多功能跳转函数
2014/06/19 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
2018/02/07 PHP
PHP 超级全局变量相关总结
2020/06/30 PHP
JavaScript 克隆数组最简单的方法
2009/02/12 Javascript
js arguments.callee的应用代码
2009/05/07 Javascript
JS鼠标事件大全 推荐收藏
2011/11/01 Javascript
JavaScript strike方法入门实例(给字符串加上删除线)
2014/10/17 Javascript
简单三步实现报表页面集成天气
2016/12/15 Javascript
使用Angular缓存父页面数据的方法
2017/01/03 Javascript
详解angularJs中自定义directive的数据交互
2017/01/13 Javascript
利用angularjs1.4制作的简易滑动门效果
2017/02/28 Javascript
Node.js编写CLI的实例详解
2017/05/17 Javascript
vue系列之requireJs中引入vue-router的方法
2018/07/18 Javascript
Vue递归实现树形菜单方法实例
2018/11/06 Javascript
Vue-CLI3.x 设置反向代理的方法
2018/12/06 Javascript
微信小程序用户授权、位置授权及获取微信绑定手机号
2019/07/18 Javascript
python装饰器与递归算法详解
2016/02/18 Python
python实现域名系统(DNS)正向查询的方法
2016/04/19 Python
Python中将字典转换为列表的方法
2016/09/21 Python
Redis使用watch完成秒杀抢购功能的代码
2018/05/07 Python
python实现的config文件读写功能示例
2019/09/24 Python
Python3实现二叉树的最大深度
2019/09/30 Python
解决Pycharm 导入其他文件夹源码的2种方法
2020/02/12 Python
使用Keras中的ImageDataGenerator进行批次读图方式
2020/06/17 Python
Python爬虫新手入门之初学lxml库
2020/12/20 Python
检测用户浏览器是否支持CSS3的方法
2009/08/29 HTML / CSS
2014各大专业毕业生自我评价
2014/09/17 职场文书
村委会贫困证明范本
2014/09/17 职场文书
同学聚会邀请函
2015/01/30 职场文书
综合素质评价自我评价
2015/03/06 职场文书
感恩老师主题班会
2015/08/12 职场文书
2016年“抗战胜利纪念日”71周年校园广播稿
2015/12/18 职场文书
2019奶茶店创业计划书范本,值得你借鉴
2019/08/14 职场文书
Golang bufio详细讲解
2022/04/21 Golang
PHP 时间处理类Carbon
2022/05/20 PHP