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实现简单状态框架的方法
Mar 19 Python
python解决方案:WindowsError: [Error 2]
Aug 28 Python
Python简单删除列表中相同元素的方法示例
Jun 12 Python
关于反爬虫的一些简单总结
Dec 13 Python
Python3正则匹配re.split,re.finditer及re.findall函数用法详解
Jun 11 Python
wtfPython—Python中一组有趣微妙的代码【收藏】
Aug 31 Python
Python生成器的使用方法和示例代码
Mar 04 Python
Numpy对数组的操作:创建、变形(升降维等)、计算、取值、复制、分割、合并
Aug 28 Python
python编写计算器功能
Oct 25 Python
Python上下文管理器全实例详解
Nov 12 Python
pycharm内无法import已安装的模块问题解决
Feb 12 Python
python主要用于哪些方向
Jul 05 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
实用函数8
2007/11/08 PHP
php数组函数序列之array_flip() 将数组键名与值对调
2011/11/07 PHP
thinkphp判断访客为手机端或PC端的方法
2014/11/24 PHP
如何用PHP做到页面注册审核
2017/03/02 PHP
PHP7数组的底层实现示例
2019/08/25 PHP
js实现鼠标感应向下滑动隐藏菜单的方法
2015/02/20 Javascript
JavaScript动态加载样式表的方法
2015/03/21 Javascript
JavaScript获取DOM元素的11种方法总结
2015/04/25 Javascript
Jquery 自定义事件实现发布/订阅的简单实例
2016/06/12 Javascript
Javascript面试经典套路reduce函数查重
2017/03/23 Javascript
神级程序员JavaScript300行代码搞定汉字转拼音
2017/05/20 Javascript
[js高手之路]原型式继承与寄生式继承详解
2017/08/28 Javascript
基于VuePress 轻量级静态网站生成器的实现方法
2018/04/17 Javascript
vue组件jsx语法的具体使用
2018/05/21 Javascript
JavaScript捕捉事件和阻止冒泡事件实例分析
2018/08/03 Javascript
element UI upload组件上传附件格式限制方法
2018/09/04 Javascript
在Python程序中操作MySQL的基本方法
2015/07/29 Python
python3批量删除豆瓣分组下的好友的实现代码
2016/06/07 Python
Python程序运行原理图文解析
2018/02/10 Python
Python基于辗转相除法求解最大公约数的方法示例
2018/04/04 Python
python实现键盘输入的实操方法
2019/07/16 Python
Django 过滤器汇总及自定义过滤器使用详解
2019/07/19 Python
Python 获取numpy.array索引值的实例
2019/12/06 Python
python TCP包注入方式
2020/05/05 Python
使用python采集Excel表中某一格数据
2020/05/14 Python
css3实现3d旋转动画特效
2015/03/10 HTML / CSS
MCAKE蛋糕官方网站:一直都是巴黎的味道
2018/02/06 全球购物
美国班级戒指、帽子和礼服、毕业产品、年鉴:Balfour
2018/11/01 全球购物
实习单位接收函
2014/01/11 职场文书
珍爱生命演讲稿
2014/05/10 职场文书
廉洁自律演讲稿
2014/05/22 职场文书
月度优秀员工获奖感言
2014/08/16 职场文书
旷课检讨书
2015/01/26 职场文书
MYSQL 无法识别中文的永久解决方法
2021/06/03 MySQL
React配置子路由的实现
2021/06/03 Javascript
分享Python异步爬取知乎热榜
2022/04/12 Python