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中字符串的修改及传参详解
Nov 30 Python
Python 稀疏矩阵-sparse 存储和转换
May 27 Python
PyChar学习教程之自定义文件与代码模板详解
Jul 17 Python
使用Python写一个贪吃蛇游戏实例代码
Aug 21 Python
Python实现扩展内置类型的方法分析
Oct 16 Python
python使用itchat库实现微信机器人(好友聊天、群聊天)
Jan 04 Python
PyTorch上实现卷积神经网络CNN的方法
Apr 28 Python
python+pandas+时间、日期以及时间序列处理方法
Jul 10 Python
Windows下python3.7安装教程
Jul 31 Python
使用50行Python代码从零开始实现一个AI平衡小游戏
Nov 21 Python
python3利用ctypes传入一个字符串类型的列表方法
Feb 12 Python
Django中的FBV和CBV用法详解
Sep 15 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表达式
2006/10/09 PHP
简单的PHP多图上传小程序代码
2011/07/17 PHP
php通过COM类调用组件的实现代码
2012/01/11 PHP
apache+codeigniter 通过.htcaccess做动态二级域名解析
2012/07/01 PHP
Codeigniter(CI)框架分页函数及相关知识
2014/11/03 PHP
phpstorm 配置xdebug的示例代码
2019/03/31 PHP
ExtJS Grid使用SimpleStore、多选框的方法
2009/11/20 Javascript
JQuery.closest(),parent(),parents()寻找父结点
2012/02/17 Javascript
使用jquery实现图文切换效果另加特效
2013/01/20 Javascript
innerText和textContent对比及使用介绍
2013/02/27 Javascript
js onload事件不起作用示例分析
2013/10/09 Javascript
js图片向右一张张滚动效果实例代码
2013/11/23 Javascript
jquery简单的弹出层浮动层代码
2015/04/27 Javascript
JS+CSS实现大气的黑色首页导航菜单效果代码
2015/09/10 Javascript
Bootstrap三种表单布局的使用方法
2016/06/21 Javascript
jquery.multiselect多选下拉框实现代码
2016/11/11 Javascript
jQuery Autocomplete简介_动力节点Java学院整理
2017/07/17 jQuery
Javascript实现运算符重载详解
2018/04/07 Javascript
Vue 中mixin 的用法详解
2018/04/23 Javascript
JavaScript多态与封装实例分析
2018/07/27 Javascript
深入解析koa之异步回调处理
2019/06/17 Javascript
通过js实现压缩图片上传功能
2020/02/25 Javascript
[00:47]TI7不朽珍藏III——沙王不朽展示
2017/07/15 DOTA
[01:14:19]NAVI vs Mineski 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
python动态加载包的方法小结
2016/04/18 Python
python执行使用shell命令方法分享
2017/11/08 Python
浅谈Python实现贪心算法与活动安排问题
2017/12/19 Python
Python 在OpenCV里实现仿射变换—坐标变换效果
2019/08/30 Python
pyinstaller打包成无控制台程序时运行出错(与popen冲突的解决方法)
2020/04/15 Python
Python爬虫小例子——爬取51job发布的工作职位
2020/07/10 Python
python 使用递归的方式实现语义图片分割功能
2020/07/16 Python
让IE支持CSS3的不完全兼容方案
2014/09/19 HTML / CSS
前后端结合实现amazeUI分页效果
2020/08/21 HTML / CSS
努比亚手机官网:nubia
2016/10/06 全球购物
毕业感言怎么写
2015/07/31 职场文书
用PYTHON去计算88键钢琴的琴键频率和音高
2022/04/10 Python