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实现的二维码生成小软件
Jul 11 Python
python查找目录下指定扩展名的文件实例
Apr 01 Python
Python使用回溯法子集树模板解决爬楼梯问题示例
Sep 08 Python
python3利用venv配置虚拟环境及过程中的小问题小结
Aug 01 Python
python调用百度REST API实现语音识别
Aug 30 Python
详解django自定义中间件处理
Nov 21 Python
python利用Tesseract识别验证码的方法示例
Jan 21 Python
python3.7实现云之讯、聚合短信平台的短信发送功能
Sep 26 Python
Python 列表中的修改、添加和删除元素的实现
Jun 11 Python
简单了解Django项目应用创建过程
Jul 06 Python
对pytorch中x = x.view(x.size(0), -1) 的理解说明
Mar 03 Python
Python 内置函数速查表一览
Jun 02 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 header()函数常用方法总结
2014/04/11 PHP
详解Yii2 之 生成 URL 的方法
2017/06/16 PHP
不用锚点也可以平滑滚动到页面的指定位置实现代码
2013/05/08 Javascript
js判断客户端是iOS还是Android等移动终端的方法
2013/12/11 Javascript
JS常用表单验证方法总结
2014/05/22 Javascript
让html页面不缓存js的实现方法
2014/10/31 Javascript
node.js中的fs.readFile方法使用说明
2014/12/15 Javascript
jquery 构造函数在表单提交过程中修改数据
2015/05/25 Javascript
jquery中object对象循环遍历的方法
2015/12/18 Javascript
JavaScript数组去重的两种方法推荐
2016/04/05 Javascript
jQuery Ajax前后端使用JSON进行交互示例
2017/03/17 Javascript
原生js+cookie实现购物车功能的方法分析
2017/12/21 Javascript
小白教程|一小时上手最流行的前端框架vue(推荐)
2019/04/10 Javascript
layui监听工具栏的实例(操作列表按钮)
2019/09/10 Javascript
ES2020 新特性(种草)
2020/01/12 Javascript
vue+element 实现商城主题开发的示例代码
2020/03/26 Javascript
[42:32]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
Eclipse中Python开发环境搭建简单教程
2016/03/23 Python
详解python Todo清单实战
2018/11/01 Python
python add_argument()用法解析
2020/01/29 Python
使用python实现飞机大战游戏
2020/03/23 Python
python的launcher用法知识点总结
2020/08/07 Python
python字典与json转换的方法总结
2020/12/28 Python
阿玛瑞酒店中文官方网站:Amari.com
2018/02/13 全球购物
Godiva巧克力英国官网:比利时歌帝梵巧克力
2018/08/28 全球购物
介绍一下RMI的基本概念
2016/12/17 面试题
新闻专业毕业生英文求职信
2014/03/19 职场文书
《春晓》教学反思
2014/04/20 职场文书
创先争优公开承诺书
2014/08/30 职场文书
科学发展观演讲稿
2014/09/11 职场文书
班主任经验交流材料
2014/12/16 职场文书
师德师风主题教育活动总结
2015/05/07 职场文书
预备党员考察表党小组意见
2015/06/01 职场文书
《草船借箭》教学反思
2016/02/23 职场文书
golang 在windows中设置环境变量的操作
2021/04/29 Golang
「我的青春恋爱物语果然有问题。-妄言录-」第20卷封面公开
2022/03/21 日漫