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实现的一个找零钱的小程序代码分享
Aug 25 Python
Python中使用pprint函数进行格式化输出的教程
Apr 07 Python
Python的爬虫框架scrapy用21行代码写一个爬虫
Apr 24 Python
Python绑定方法与非绑定方法详解
Aug 18 Python
PyTorch上实现卷积神经网络CNN的方法
Apr 28 Python
python学生管理系统学习笔记
Mar 19 Python
wxpython+pymysql实现用户登陆功能
Nov 19 Python
Python跑循环时内存泄露的解决方法
Jan 13 Python
浅谈tensorflow中Dataset图片的批量读取及维度的操作详解
Jan 20 Python
pyqt5 QlistView列表显示的实现示例
Mar 24 Python
Python 通过爬虫实现GitHub网页的模拟登录的示例代码
Aug 17 Python
python 牛顿法实现逻辑回归(Logistic Regression)
Oct 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通用分页类page.php[仿google分页]
2008/08/31 PHP
PHP中的正则表达式函数介绍
2012/02/27 PHP
php使用GeoIP库实例
2014/06/27 PHP
微信公众号支付之坑:调用支付jsapi缺少参数 timeStamp等错误解决方法
2016/01/12 PHP
PHP Callable强制指定回调类型的方法
2016/08/30 PHP
php实现购物车产品删除功能(2)
2020/07/23 PHP
NodeJS学习笔记之Connect中间件模块(二)
2015/01/27 NodeJs
JavaScript让Textarea支持tab按键的方法
2015/06/26 Javascript
JS实现选中当前菜单后高亮显示的导航条效果
2015/10/15 Javascript
BootStrap 超链接变按钮的实现方法
2016/09/25 Javascript
js HTML5上传示例代码完整版
2016/10/10 Javascript
vuex 解决报错this.$store.commit is not a function的方法
2018/12/17 Javascript
如何使用VuePress搭建一个类型element ui文档
2019/02/14 Javascript
详解微信小程序的不同函数调用的几种方法
2019/05/08 Javascript
js实现数字从零慢慢增加到指定数字示例
2019/11/07 Javascript
Vue axios与Go Frame后端框架的Options请求跨域问题详解
2020/03/03 Javascript
vue中使用腾讯云Im的示例
2020/10/23 Javascript
python 中字典嵌套列表的方法
2018/07/03 Python
Django 实现将图片转为Base64,然后使用json传输
2020/03/27 Python
在ipython notebook中使用argparse方式
2020/04/20 Python
pycharm2020.2 配置使用的方法详解
2020/09/16 Python
python 如何用urllib与服务端交互(发送和接收数据)
2021/03/04 Python
html5记忆翻牌游戏实现思路及代码
2013/07/25 HTML / CSS
Expedia爱尔兰:酒店、机票、租车及廉价假期
2017/01/02 全球购物
老师推荐信
2013/10/28 职场文书
应届毕业生求职信范文
2013/12/18 职场文书
园林技术个人的自我评价
2014/02/15 职场文书
向国旗敬礼学生寄语大全
2014/09/30 职场文书
客房服务员岗位职责
2015/02/09 职场文书
2015年化验室工作总结
2015/04/23 职场文书
大学生党课心得体会
2016/01/07 职场文书
高中化学教学反思
2016/02/22 职场文书
导游词之澳门妈祖庙
2019/12/19 职场文书
为Java项目添加Redis缓存的方法
2021/05/18 Redis
Redis模仿手机验证码发送的实现示例
2021/11/02 Redis
对象析构函数__del__在Python中何时使用
2022/03/22 Python