python复合条件下的字典排序


Posted in Python onDecember 18, 2020

知乎上有人说,Python3.6以后字典有序且更高效了。群里有同学推荐了这篇文章给我看,并咨询字典排序的问题。

大致浏览了一下,我当即表示不能认同这个说法。这篇文章的作者,应该是一位资深的专业人士,对于Python解释器如何实现字典存储和检索有着深刻地理解。但他犯了一明显的常识性错误:在逻辑上,字典是数据的无序集合,仅依赖于键检索。我们说字典是无序,不是指字典在物理实体上实现的时候真的无序,而是指它的顺序对用户而言没有明确的界定,不能作为数据的特性使用。知乎上这篇文章讲的字典有序,是指字典在物理实体上实现时的有序,而非逻辑上的有序。

既然字典是无序的,为什么还有那么多讨论字典排序的话题呢?其实,在Py2时代,就存在有序字典(orderdict),但有序字典和我们讨论的字典,并非一码事儿。所谓的字典排序,实质上是根据排序规则将字典的键排序,得到的排序结果是一个列表。

我们用一个例子来演示一下字典排序:roster是一个保存学生信息的字典,请按照女生优先、低年级在前、总成绩从高到底排序;如果总成绩相同,则顺序比较语文、数学、英语成绩,高者在前。

roster = {
  '李妍可': {'性别':'女', '年级':3, '语文':98, '数学':95, '英语':100}, 
  '邬胜杰': {'性别':'男', '年级':5, '语文':95, '数学':100, '英语':97},
  '白星瑶': {'性别':'女', '年级':2, '语文':100, '数学':99, '英语':100},
  '吴诗涵': {'性别':'男', '年级':3, '语文':98, '数学':92, '英语':90},
  '庄嘉顺': {'性别':'男', '年级':5, '语文':97, '数学':95, '英语':100}
}

Python最常用的排序函数是sorted(),我们就用sorted()来实现这个排序。如果一次写出复合排序条件,有一定难度。我们化繁为简,一步步实现。

1. 比较总成绩

>>> sorted(roster, key=lambda name:roster[name]['语文']+roster[name]['数学']+roster[name]['英语'])
['吴诗涵', '邬胜杰', '庄嘉顺', '李妍可', '白星瑶']

看起来没有问题,但sorted默认是升序,总成绩从高到底排序的话,要使用reverse=True这个参数。

>>> sorted(roster, key=lambda name:roster[name]['语文']+roster[name]['数学']+roster[name]['英语'], reverse=True)
['白星瑶', '李妍可', '邬胜杰', '庄嘉顺', '吴诗涵']

2. 再来尝试女生优先、低年级在前的两个条件排序

只要在lambda函数中,把排序项并列写出来,sorted()就会自动实现符合条件排序。这里性别排序的条件是'性别'==‘男',对女生而言,结果是False(0),小于男生的True(1),自然就排在了前面。

>>> sorted(roster, key=lambda name:(roster[name]['性别']=='男',roster[name]['年级']))
['白星瑶', '李妍可', '吴诗涵', '邬胜杰', '庄嘉顺']

3. 最终实现

尝试了单个条件和两个条件的排序之后,实现本题目的最终要求就很容易了。不过,成绩降序排列的话,不能直接使用reverse=True,因为会影响性别和年级的排序。我们可以稍微变通一下,达到最终的目的。

>>> sorted(roster, key=lambda name:(
    roster[name]['性别']=='男',
    roster[name]['年级'],
    300-roster[name]['语文']-roster[name]['数学']-roster[name]['英语'],
    100-roster[name]['语文'],
    100-roster[name]['数学'],
    100-roster[name]['英语']
  ))
['白星瑶', '李妍可', '吴诗涵', '庄嘉顺', '邬胜杰']

 到此这篇关于python复合条件下的字典排序的文章就介绍到这了,更多相关python 字典排序内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python基础教程之udp端口扫描
Feb 10 Python
Python使用MD5加密字符串示例
Aug 22 Python
用TensorFlow实现多类支持向量机的示例代码
Apr 28 Python
解决python "No module named pip" 的问题
Oct 13 Python
Python3.6实现根据电影名称(支持电视剧名称),获取下载链接的方法
Aug 26 Python
Django 创建后台,配置sqlite3教程
Nov 18 Python
Tkinter中复选菜单是否被选中的判断与设置方式
Mar 04 Python
解决运行出现'dict' object has no attribute 'has_key'问题
Jul 15 Python
Python读写压缩文件的方法
Jul 30 Python
学点简单的Django之第一个Django程序的实现
Feb 24 Python
Python爬虫之爬取二手房信息
Apr 27 Python
Python pandas之求和运算和非空值个数统计
Aug 07 Python
python 监控服务器是否有人远程登录(详细思路+代码)
Dec 18 #Python
细说NumPy数组的四种乘法的使用
Dec 18 #Python
如何通过python检查文件是否被占用
Dec 18 #Python
python 实现端口扫描工具
Dec 18 #Python
Python-split()函数实例用法讲解
Dec 18 #Python
Python+Opencv实现把图片、视频互转的示例
Dec 17 #Python
python 利用jieba.analyse进行 关键词提取
Dec 17 #Python
You might like
PHP函数学习之PHP函数点评
2012/07/05 PHP
php发送post请求的三种方法
2014/02/11 PHP
php中隐形字符65279(utf-8的BOM头)问题
2014/08/16 PHP
php制作基于xml的RSS订阅源功能示例
2017/02/08 PHP
PHP PDOStatement::fetch讲解
2019/01/31 PHP
php项目中类的自动加载实例讲解
2019/09/12 PHP
js获取url中指定参数值的示例代码
2013/12/14 Javascript
JS中如何设置readOnly的值
2013/12/25 Javascript
javascript判断是否按回车键并解决浏览器之间的差异
2014/05/13 Javascript
jQuery中使用each处理json数据
2015/04/23 Javascript
介绍JavaScript中Math.abs()方法的使用
2015/06/14 Javascript
javascript面向对象程序设计高级特性经典教程(值得收藏)
2016/05/19 Javascript
jQuery中的each()详细介绍(推荐)
2016/05/25 Javascript
chrome下判断点击input上标签还是其余标签的实现方法
2016/09/18 Javascript
利用js定义一个导航条菜单
2017/03/14 Javascript
nodejs模块学习之connect解析
2017/07/05 NodeJs
vuejs事件中心管理组件间的通信详解
2017/08/09 Javascript
利用JavaScript的%做隔行换色的实例
2017/11/25 Javascript
angularJs自定义过滤器实现手机号信息隐藏的方法
2018/10/08 Javascript
PHPStorm中如何对nodejs项目进行单元测试详解
2019/02/28 NodeJs
JS使用new操作符创建对象的方法分析
2019/05/30 Javascript
vue2.0项目集成Cesium的实现方法
2019/07/30 Javascript
es6数组之扩展运算符操作实例分析
2020/04/25 Javascript
python自然语言编码转换模块codecs介绍
2015/04/08 Python
python实时获取外部程序输出结果的方法
2019/01/12 Python
Python判断对象是否为文件对象(file object)的三种方法示例
2019/04/26 Python
解决python -m pip install --upgrade pip 升级不成功问题
2020/03/05 Python
详解pandas中利用DataFrame对象的.loc[]、.iloc[]方法抽取数据
2020/12/13 Python
python 邮件检测工具mmpi的使用
2021/01/04 Python
Hurley官方网站:扎根于海滩生活方式的全球青年文化品牌
2020/05/18 全球购物
小学教师管理制度
2014/01/18 职场文书
大学自主招生自荐信范文
2014/02/26 职场文书
物理系毕业生自荐书
2014/06/13 职场文书
小学生班干部竞选稿
2015/11/20 职场文书
解决thinkphp6(tp6)在状态码500下不报错,或者显示错误“Malformed UTF-8 characters”的问题
2021/04/01 PHP
CSS使用SVG实现动态分布的圆环发散路径动画
2022/12/24 HTML / CSS