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获取SQLite查询结果表列名的方法
Jun 21 Python
详谈pandas中agg函数和apply函数的区别
Apr 20 Python
Sanic框架Cookies操作示例
Jul 17 Python
python面向对象入门教程之从代码复用开始(一)
Dec 11 Python
Python实现对特定列表进行从小到大排序操作示例
Feb 11 Python
python rsa实现数据加密和解密、签名加密和验签功能
Sep 18 Python
Django实现auth模块下的登录注册与注销功能
Oct 10 Python
利用Python脚本实现自动刷网课
Feb 03 Python
Django CSRF认证的几种解决方案
Mar 03 Python
Python loguru日志库之高效输出控制台日志和日志记录
Mar 07 Python
Python yield生成器和return对比代码实例
Apr 20 Python
利用python调用摄像头的实例分析
Jun 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实现让页面只能被百度gogole蜘蛛访问的方法
2009/12/29 PHP
php expects parameter 1 to be resource, array given 错误
2011/03/23 PHP
PHP生成sitemap.xml地图函数
2013/11/13 PHP
php随机显示图片的简单示例
2014/02/15 PHP
php读取excel文件示例分享(更新修改excel)
2014/02/27 PHP
针对多用户实现头像上传功能PHP代码 适用于登陆页面制作
2016/08/17 PHP
Yii实现复选框批量操作实例代码
2017/03/15 PHP
Yii2使用$this->context获取当前的Module、Controller(控制器)、Action等
2017/03/29 PHP
javascript数字数组去重复项的实现代码
2010/12/30 Javascript
关于event.cancelBubble和event.stopPropagation()的区别介绍
2011/12/11 Javascript
javascript中AJAX用法实例分析
2015/01/30 Javascript
懒加载实现的分页&&网站footer自适应
2016/12/21 Javascript
微信小程序开发的四十个技术窍门总结(推荐)
2017/01/23 Javascript
JavaScript实现的斑马线表格效果【隔行变色】
2017/09/18 Javascript
Vuepress 搭建带评论功能的静态博客的实现
2019/02/17 Javascript
JS实现给数组对象排序的方法分析
2019/06/24 Javascript
JavaScript 如何计算文本的行数的实现
2020/09/14 Javascript
vue常用高阶函数及综合实例
2021/02/25 Vue.js
Python多进程同步简单实现代码
2016/04/27 Python
Python探索之爬取电商售卖信息代码示例
2017/10/27 Python
python根据list重命名文件夹里的所有文件实例
2018/10/25 Python
pyside+pyqt实现鼠标右键菜单功能
2020/12/08 Python
python语言基本语句用法总结
2019/06/11 Python
Python GUI编程 文本弹窗的实例
2019/06/11 Python
Django admin.py 在修改/添加表单界面显示额外字段的方法
2019/08/22 Python
python GUI框架pyqt5 对图片进行流式布局的方法(瀑布流flowlayout)
2020/03/12 Python
sklearn线性逻辑回归和非线性逻辑回归的实现
2020/06/09 Python
pandas之分组groupby()的使用整理与总结
2020/06/18 Python
HTML+CSS3 模仿Windows7 桌面效果
2010/06/17 HTML / CSS
雅诗兰黛旗下走天然植物路线的彩妆品牌:Prescriptives
2016/08/14 全球购物
办理信用卡工作证明
2014/01/11 职场文书
银行服务感言
2014/03/01 职场文书
医学生毕业自我鉴定
2014/03/26 职场文书
厕所文明标语
2014/06/11 职场文书
公积金接收函格式
2015/01/30 职场文书
捐款仪式主持词
2015/07/04 职场文书