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中字符串的格式化方法小结
May 03 Python
Python数据操作方法封装类实例
Jun 23 Python
Python画柱状统计图操作示例【基于matplotlib库】
Jul 04 Python
python获取磁盘号下盘符步骤详解
Jun 19 Python
Tensorflow实现神经网络拟合线性回归
Jul 19 Python
Django 模型类(models.py)的定义详解
Jul 19 Python
Python脚本操作Excel实现批量替换功能
Nov 20 Python
python GUI库图形界面开发之PyQt5拖放控件实例详解
Feb 25 Python
解决django框架model中外键不落实到数据库问题
May 20 Python
Scrapy项目实战之爬取某社区用户详情
Sep 17 Python
Python爬虫抓取论坛关键字过程解析
Oct 19 Python
Selenium浏览器自动化如何上传文件
Apr 06 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 上传功能实例代码
2010/04/13 PHP
php中mysql连接和基本操作代码(快速测试使用,简单方便)
2014/04/25 PHP
laravel安装和配置教程
2014/10/29 PHP
php支持断点续传、分块下载的类
2016/05/02 PHP
搜索附近的人PHP实现代码
2018/02/11 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
2020/04/04 PHP
CSS+Table图文混排中实现文本自适应图片宽度(超简单+跨所有浏览器)
2009/02/14 Javascript
也说JavaScript中String类的replace函数
2011/09/22 Javascript
jQuery实现列表自动滚动循环滚动展示新闻
2014/08/22 Javascript
通过隐藏iframe实现无刷新上传文件操作
2016/03/16 Javascript
JavaScript sort数组排序方法和自我实现排序方法小结
2016/06/06 Javascript
JS实现的表格行上下移动操作示例
2016/08/03 Javascript
JavaScript数组去重由慢到快由繁到简(优化篇)
2016/08/26 Javascript
为JQuery EasyUI 表单组件增加焦点切换功能的方法
2017/04/13 jQuery
基于vue的换肤功能的示例代码
2017/10/10 Javascript
Vue拖拽组件开发实例详解
2018/05/11 Javascript
微信小程序使用template标签实现五星评分功能
2018/11/03 Javascript
详解关于Angular4 ng-zorro使用过程中遇到的问题
2018/12/05 Javascript
如何获取vue单文件自身源码路径
2019/05/06 Javascript
浅谈Vue 自动化部署打包上线
2020/06/14 Javascript
JavaScript原生数组函数实例汇总
2020/10/14 Javascript
vue+element实现动态加载表单
2020/12/13 Vue.js
[01:02:45]完美世界DOTA2联赛 LBZS vs Forest 第三场 11.07
2020/11/09 DOTA
pymssql ntext字段调用问题解决方法
2008/12/17 Python
python解析xml文件操作实例
2014/10/05 Python
Python的Django框架中TEMPLATES项的设置教程
2015/05/29 Python
Python使用functools实现注解同步方法
2018/02/06 Python
Python实现手写一个类似django的web框架示例
2018/07/20 Python
我能否用void** 指针作为参数, 使函数按引用接受一般指针
2013/02/16 面试题
2013年军训通讯稿
2014/02/05 职场文书
青年志愿者活动总结
2014/04/26 职场文书
诚信的演讲稿范文
2014/05/12 职场文书
最常使用的求职信
2014/05/25 职场文书
保密工作承诺书
2014/08/29 职场文书
Nginx配置并兼容HTTP实现代码解析
2021/03/31 Servers
CSS 伪元素::marker详解
2021/06/26 HTML / CSS