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实现倒计时的示例
Feb 14 Python
Python中动态检测编码chardet的使用教程
Jul 06 Python
python调用Matplotlib绘制分布点并且添加标签
May 31 Python
Python运维开发之psutil库的使用详解
Oct 18 Python
Flask框架web开发之零基础入门
Dec 10 Python
python实现海螺图片的方法示例
May 12 Python
python 实现GUI(图形用户界面)编程详解
Jul 17 Python
Python enumerate函数遍历数据对象组合过程解析
Dec 11 Python
python如何实现DES加密
Sep 21 Python
Opencv python 图片生成视频的方法示例
Nov 18 Python
Python的这些库,你知道多少?
Jun 09 Python
Python+Pillow+Pytesseract实现验证码识别
May 11 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中关于抽象(abstract)类和抽象方法的问题分析
2014/01/03 PHP
利用PHP实现一个简单的用户登记表示例
2017/04/25 PHP
PHP数据库操作二:memcache用法分析
2017/08/16 PHP
thinkPHP框架自动填充原理与用法分析
2018/04/03 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
2018/06/16 PHP
newxtree.js代码
2007/03/13 Javascript
javascript getElementsByName()的用法说明
2009/07/31 Javascript
Javascript学习笔记4 Eval函数
2010/01/11 Javascript
从零开始学习jQuery (二) 万能的选择器
2010/10/01 Javascript
JS 毫秒转时间示例代码
2013/09/22 Javascript
javascript学习笔记(六)数据类型和JSON格式
2014/10/08 Javascript
jQuery对于显示和隐藏等常用状态的判断方法
2014/12/13 Javascript
jquery实现手机号码选号的方法
2015/07/31 Javascript
javascript实现表单验证
2016/01/29 Javascript
jQuery Validate表单验证插件的基本使用方法及功能拓展
2017/01/04 Javascript
Web制作验证码功能实例代码
2017/06/19 Javascript
浅谈ajax请求不同页面的微信JSSDK问题
2018/02/26 Javascript
详解如何制作并发布一个vue的组件的npm包
2018/11/10 Javascript
js实现转动骰子模型
2019/10/24 Javascript
如何手写简易的 Vue Router
2020/10/10 Javascript
Python中文件的写入读取以及附加文字方法
2019/01/23 Python
Python模块汇总(常用第三方库)
2019/10/07 Python
Python实现密码薄文件读写操作
2019/12/16 Python
在python中使用nohup命令说明
2020/04/16 Python
Python虚拟环境venv用法详解
2020/05/25 Python
将pycharm配置为matlab或者spyder的用法说明
2020/06/08 Python
Python之Sklearn使用入门教程
2021/02/19 Python
html5的localstorage详解
2017/05/09 HTML / CSS
HTML5安全介绍之内容安全策略(CSP)简介
2012/07/10 HTML / CSS
潘多拉意大利官方网上商城:网上选购PANDORA珠宝
2018/10/07 全球购物
请说出几个常用的异常类
2013/01/08 面试题
信息管理专业推荐信
2013/10/29 职场文书
一份报关员的职业规划范文
2014/01/08 职场文书
道德之星事迹材料
2014/05/03 职场文书
教你使用Pandas直接核算Excel中快递费用
2021/05/12 Python
JS开发前端团队展示控制器来为成员引流
2022/08/14 Javascript