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中SocketServer模块处理网络请求的用法
Jun 28 Python
python使用正则表达式的search()函数实现指定位置搜索功能
Nov 10 Python
windows 下python+numpy安装实用教程
Dec 23 Python
Python2.7 实现引入自己写的类方法
Apr 29 Python
python+influxdb+shell编写区域网络状况表
Jul 27 Python
Python pygorithm模块用法示例【常见算法测试】
Aug 16 Python
python散点图实例之随机漫步
Aug 27 Python
python中的不可变数据类型与可变数据类型详解
Sep 16 Python
淘宝秒杀python脚本 扫码登录版
Sep 19 Python
区分python中的进程与线程
Aug 13 Python
python+selenium小米商城红米K40手机自动抢购的示例代码
Mar 24 Python
Python使用scapy模块发包收包
May 07 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
PHPMailer安装方法及简单实例
2008/11/25 PHP
使用PHP静态变量当缓存的方法
2013/11/13 PHP
PHP设置头信息及取得返回头信息的方法
2016/01/25 PHP
分析PHP中单双引号的误区和双引号小隐患
2016/07/19 PHP
PHP中命名空间的使用例子
2019/03/22 PHP
js操作textarea方法集合封装(兼容IE,firefox)
2011/02/22 Javascript
使用jquery插件实现图片延迟加载技术详细说明
2011/03/12 Javascript
如何获取select下拉框的值(option没有及有value属性)
2013/11/08 Javascript
JavaScript创建一个object对象并操作对象属性的用法
2015/03/23 Javascript
基于nodejs+express(4.x+)实现文件上传功能
2015/11/23 NodeJs
JS判断字符串字节数并截取长度的方法
2016/03/05 Javascript
jquery判断页面网址是否有效的两种方法
2016/12/11 Javascript
jQuery焦点图轮播效果实现方法
2016/12/19 Javascript
js 数字、字符串、布尔值的转换方法(必看)
2017/04/07 Javascript
细说webpack源码之compile流程-入口函数run
2017/12/26 Javascript
vue单页面实现当前页面刷新或跳转时提示保存
2018/11/02 Javascript
微信小程序五子棋游戏AI实现方法【附demo源码下载】
2019/02/20 Javascript
ES6中Promise的使用方法实例总结
2020/02/18 Javascript
Node.js API详解之 readline模块用法详解
2020/05/22 Javascript
javascript实现图片轮换动作方法
2020/08/07 Javascript
[02:56]DOTA2上海特锦赛小组赛解说FreeAgain采访花絮
2016/02/27 DOTA
[01:06]DOTA2隆重推出2016冬季勇士令状 内含上海特级锦标赛互动指南
2016/02/17 DOTA
Python Selenium Cookie 绕过验证码实现登录示例代码
2018/04/10 Python
Python pandas实现excel工作表合并功能详解
2019/08/29 Python
Python ATM功能实现代码实例
2020/03/19 Python
Python几种常见算法汇总
2020/06/02 Python
Python爬虫实现自动登录、签到功能的代码
2020/08/20 Python
bareMinerals官网:矿物质化妆品和护肤品
2018/02/04 全球购物
法律专业应届生自荐信范文
2014/01/06 职场文书
报关专员求职信范文
2014/02/22 职场文书
要账委托书范本
2014/09/15 职场文书
终止劳动合同证明书样本
2014/11/19 职场文书
孔庙导游词
2015/02/04 职场文书
高中信息技术教学反思
2016/02/16 职场文书
2019已经过半,你知道年中工作总结该怎么写吗?
2019/07/03 职场文书
六个好看实用的 HTML + CSS 后台登录入口页面
2022/04/28 HTML / CSS