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 01 Python
python安装mysql-python简明笔记(ubuntu环境)
Jun 25 Python
Python 包含汉字的文件读写之每行末尾加上特定字符
Dec 12 Python
python使用opencv进行人脸识别
Apr 07 Python
Python实现简单的获取图片爬虫功能示例
Jul 12 Python
Python基于正则表达式实现检查文件内容的方法【文件检索】
Aug 30 Python
unittest+coverage单元测试代码覆盖操作实例详解
Apr 04 Python
基于Python实现定时自动给微信好友发送天气预报
Oct 25 Python
使用tensorflow显示pb模型的所有网络结点方式
Jan 23 Python
Scrapy框架实现的登录网站操作示例
Feb 06 Python
基于tensorflow for循环 while循环案例
Jun 30 Python
PyQt5-QDateEdit的简单使用操作
Jul 12 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
收听短波不可能有声音清晰的品质吗
2021/03/01 无线电
php学习笔记 [预定义数组(超全局数组)]
2011/06/09 PHP
PHP Cookei记录用户历史浏览信息的代码
2016/02/03 PHP
PHP判断文件是否被引入的方法get_included_files用法示例
2016/11/29 PHP
PHP实现电商订单自动确认收货redis队列
2017/05/17 PHP
PHP 爬取网页的主要方法
2018/07/13 PHP
鼠标图片振动代码
2006/07/06 Javascript
Prototype使用指南之selector.js
2007/01/10 Javascript
jquery JSON的解析方式
2009/07/25 Javascript
jquery 插件开发方法小结
2009/10/23 Javascript
JavaScript中Cookie操作实例
2015/01/09 Javascript
js改变Iframe中Src的方法
2015/05/05 Javascript
关于angularJs指令的Scope(作用域)介绍
2016/10/25 Javascript
浅谈MVC+EF easyui dataGrid 动态加载分页表格
2016/11/10 Javascript
jQuery post数据至ashx实例详解
2016/11/18 Javascript
Bootstrap源码解读表单(2)
2016/12/22 Javascript
Angularjs实现搜索关键字高亮显示效果
2017/01/17 Javascript
Vue2 模板template的四种写法总结
2018/02/23 Javascript
Vue实现点击时间获取时间段查询功能
2020/08/21 Javascript
微信小程序停止其他视频播放当前视频的实例代码
2019/12/25 Javascript
vue中解决chrome浏览器自动播放音频和MP3语音打包到线上的实现方法
2020/10/09 Javascript
[01:33:07]VGJ.T vs Newbee Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
python从ftp下载数据保存实例
2013/11/20 Python
Python Queue模块详细介绍及实例
2016/12/27 Python
python导出hive数据表的schema实例代码
2018/01/22 Python
Django中间件工作流程及写法实例代码
2018/02/06 Python
python: 判断tuple、list、dict是否为空的方法
2018/10/22 Python
详解Python3 基本数据类型
2019/04/19 Python
Python 矩阵转置的几种方法小结
2019/12/02 Python
Python预测2020高考分数和录取情况
2020/07/08 Python
浅析关于Keras的安装(pycharm)和初步理解
2020/10/23 Python
New Balance天猫官方旗舰店:始于1906年,百年慢跑品牌
2017/11/15 全球购物
2014年电教工作总结
2014/12/19 职场文书
综合测评个人总结
2015/03/03 职场文书
暑假生活随笔
2015/08/15 职场文书
幼儿园体操比赛口号
2015/12/25 职场文书