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的循环体中使用else语句的方法
Mar 30 Python
Python 爬虫学习笔记之正则表达式
Sep 21 Python
python+selenium实现登录账户后自动点击的示例
Dec 22 Python
Python实现中一次读取多个值的方法
Apr 22 Python
Python定时任务sched模块用法示例
Jul 16 Python
python实现的MySQL增删改查操作实例小结
Dec 19 Python
详解Python sys.argv使用方法
May 10 Python
PyTorch之图像和Tensor填充的实例
Aug 18 Python
详解python中*号的用法
Oct 21 Python
关于python 的legend图例,参数使用说明
Apr 17 Python
Python项目跨域问题解决方案
Jun 22 Python
Django nginx配置实现过程详解
Sep 10 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
JAVA/JSP学习系列之四
2006/10/09 PHP
Apache无法自动跳转却显示目录的解决方法
2020/11/30 PHP
PHP实现的猴王算法(猴子选大王)示例
2018/04/30 PHP
通过Mootools 1.2来操纵HTML DOM元素
2009/09/15 Javascript
jquery实现文本框鼠标右击无效以及不能输入的代码
2010/11/05 Javascript
javascript之Partial Application学习
2013/01/10 Javascript
javascript避免数字计算精度误差的方法详解
2014/03/05 Javascript
JS计算网页停留时间代码
2014/04/28 Javascript
深入理解JavaScript系列(44):设计模式之桥接模式详解
2015/03/04 Javascript
JQuery查找DOM节点的方法
2015/06/11 Javascript
js判断移动端是否安装某款app的多种方法
2015/12/18 Javascript
基于JavaScript实现动态创建表格和增加表格行数
2015/12/20 Javascript
javascript仿百度输入框提示自动下拉补全
2016/01/07 Javascript
validationEngine 表单验证插件使用实例代码
2017/06/15 Javascript
JavaScript实现时间表动态效果
2017/07/15 Javascript
自制简易打赏功能的实例
2017/09/02 Javascript
js中apply和Math.max()函数的问题及区别介绍
2018/03/27 Javascript
Angular动画实现的2种方式以及添加购物车动画实例代码
2018/08/09 Javascript
NodeJs实现简单的爬虫功能案例分析
2018/12/05 NodeJs
在微信小程序中保存网络图片
2019/02/12 Javascript
vue 清空input标签 中file的值操作
2020/07/21 Javascript
[01:56]2014DOTA2西雅图邀请赛 MVP外卡赛老队长精辟点评
2014/07/09 DOTA
Python实现字符串格式化输出的方法详解
2017/09/20 Python
Python实现发送与接收邮件的方法详解
2018/03/28 Python
基于Python对数据shape的常见操作详解
2018/12/25 Python
Django打印出在数据库中执行的语句问题
2019/07/25 Python
Python requests模块session代码实例
2020/04/14 Python
python 密码学示例——理解哈希(Hash)算法
2020/09/21 Python
python图片合成的示例
2020/11/09 Python
使用css3制作登录表单的步骤
2014/04/07 HTML / CSS
使用CSS3来代替JS实现交互
2017/08/10 HTML / CSS
俄罗斯最大的在线手表商店:Bestwatch.ru
2020/01/11 全球购物
个人委托书怎么写
2014/04/04 职场文书
2016民族团结先进个人事迹材料
2016/02/26 职场文书
CSS中妙用 drop-shadow 实现线条光影效果
2021/11/11 HTML / CSS
Python 详解通过Scrapy框架实现爬取百度新冠疫情数据流程
2021/11/11 Python