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中 ? : 三元表达式的使用介绍
Oct 09 Python
python中lambda与def用法对比实例分析
Apr 30 Python
使用Python简单的实现树莓派的WEB控制
Feb 18 Python
wxpython中Textctrl回车事件无效的解决方法
Jul 21 Python
python爬虫框架scrapy实战之爬取京东商城进阶篇
Apr 24 Python
python中如何正确使用正则表达式的详细模式(Verbose mode expression)
Nov 08 Python
Python读取Excel表格,并同时画折线图和柱状图的方法
Oct 14 Python
Python+Selenium使用Page Object实现页面自动化测试
Jul 14 Python
详解基于python-django框架的支付宝支付案例
Sep 23 Python
wxPython绘图模块wxPyPlot实现数据可视化
Nov 19 Python
selenium 多窗口切换的实现(windows)
Jan 18 Python
Python使用BeautifulSoup4修改网页内容
May 20 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 保留小数点
2009/04/21 PHP
在PHP中操作Excel实例代码
2010/04/29 PHP
PHP 中关于ord($str)&amp;gt;0x80的详细说明
2012/09/23 PHP
thinkphp配置连接数据库技巧
2014/12/02 PHP
php+redis实现多台服务器内网存储session并读取示例
2017/01/12 PHP
Laravel接收前端ajax传来的数据的实例代码
2017/07/20 PHP
php实现微信支付之企业付款
2018/05/30 PHP
php如何把表单内容提交到数据库
2019/07/08 PHP
Laravel 实现关系模型取出需要的字段
2019/10/10 PHP
jquery tools之tabs 选项卡/页签
2009/07/25 Javascript
jQuery选择没有colspan属性的td的代码
2010/07/06 Javascript
javascript对talbe进行动态添加、删除、验证实现代码
2012/03/29 Javascript
基于jQuery的input输入框下拉提示层(自动邮箱后缀名)
2012/06/14 Javascript
ko knockoutjs动态属性绑定技巧应用
2012/11/14 Javascript
jquery缓动swing liner控制动画过程不同时刻的速度
2014/05/29 Javascript
Bootstrap Scrollspy源码学习
2017/03/02 Javascript
BootStrap 表单控件之单选按钮水平排列
2017/05/23 Javascript
Vue+Node实现的商城用户管理功能示例
2019/12/23 Javascript
vue 使用async写数字动态加载效果案例
2020/07/18 Javascript
前端 javascript 实现文件下载的示例
2020/11/24 Javascript
[02:51]2014DOTA2国际邀请赛 IG战队官方纪录片
2014/07/21 DOTA
python 正则式 概述及常用字符
2009/05/07 Python
python实现的解析crontab配置文件代码
2014/06/30 Python
python简单分割文件的方法
2015/07/30 Python
浅谈Python2获取中文文件名的编码问题
2018/01/09 Python
Python 移动光标位置的方法
2019/01/20 Python
Django之无名分组和有名分组的实现
2019/04/16 Python
详解Python用户登录接口的方法
2019/04/17 Python
使用Keras训练好的.h5模型来测试一个实例
2020/07/06 Python
html5 canvas 使用示例
2010/10/22 HTML / CSS
介绍一下Java中的Class类
2015/04/10 面试题
售后服务科岗位职责范文
2013/11/13 职场文书
三月学雷锋活动总结
2014/06/26 职场文书
2014年高三班主任工作总结
2014/12/05 职场文书
捐助倡议书
2015/01/19 职场文书
Windows11里微软已经将驱动程序安装位置A盘删除
2021/11/21 数码科技