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将ip地址转换成整数的方法
Mar 17 Python
Python模块结构与布局操作方法实例分析
Jul 24 Python
浅析Python中的赋值和深浅拷贝
Aug 15 Python
python使用筛选法计算小于给定数字的所有素数
Mar 19 Python
Python实现检测文件MD5值的方法示例
Apr 11 Python
python中for用来遍历range函数的方法
Jun 08 Python
对python周期性定时器的示例详解
Feb 19 Python
python使用Qt界面以及逻辑实现方法
Jul 10 Python
python飞机大战pygame游戏背景设计详解
Dec 17 Python
简单了解Python3 bytes和str类型的区别和联系
Dec 19 Python
如何用python写个模板引擎
Jan 14 Python
2021年pycharm的最新安装教程及基本使用图文详解
Apr 03 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
使用无限生命期Session的方法
2006/10/09 PHP
php桌面中心(三) 修改数据库
2007/03/11 PHP
PHP 批量更新网页内容实现代码
2010/01/05 PHP
解析php session_set_save_handler 函数的用法(mysql)
2013/06/29 PHP
PHP实现自动登入google play下载app report的方法
2014/09/23 PHP
event.srcElement+表格应用
2006/08/29 Javascript
验证javascript中Object和Function的关系的三段简单代码
2010/06/27 Javascript
javascript Window及document对象详细整理
2011/01/12 Javascript
一款Jquery 分页插件的改造方法(服务器端分页)
2011/07/11 Javascript
最佳的addEvent事件绑定是怎样诞生的
2011/10/24 Javascript
js加载之使用DOM方法动态加载Javascript文件
2013/11/08 Javascript
javascript Array.prototype.slice的使用示例
2013/11/14 Javascript
js和html5实现手机端刮刮卡抽奖效果完美兼容android/IOS
2013/11/18 Javascript
Javascript中arguments和arguments.callee的区别浅析
2015/04/24 Javascript
JS打印组合功能
2016/08/04 Javascript
基于node下的http小爬虫的示例代码
2018/01/11 Javascript
js Element Traversal规范中的元素遍历方法
2018/04/19 Javascript
JS匿名函数内部this指向问题详析
2019/05/10 Javascript
Vue 实现显示/隐藏层的思路(加全局点击事件)
2019/12/31 Javascript
[03:02]安得倚天剑,跨海斩长鲸——中国军团出征DOTA2国际邀请赛
2018/08/14 DOTA
用Python将动态GIF图片倒放播放的方法
2016/11/02 Python
解决python3 urllib 链接中有中文的问题
2018/07/16 Python
Python文件监听工具pyinotify与watchdog实例
2018/10/15 Python
python登录WeChat 实现自动回复实例详解
2019/05/28 Python
Python的形参和实参使用方式
2019/12/24 Python
详解Python修复遥感影像条带的两种方式
2020/02/23 Python
新手入门学习python Numpy基础操作
2020/03/02 Python
美国诺德斯特龙百货官网:Nordstrom
2016/08/23 全球购物
Linux的文件类型
2012/03/07 面试题
《陋室铭》教学反思
2014/02/26 职场文书
公司大门门卫岗位职责
2014/06/11 职场文书
做一个有道德的人活动实施方案
2014/08/23 职场文书
教师个人年终总结
2015/02/11 职场文书
格列佛游记读书笔记
2015/06/30 职场文书
2016年“5.12”护士节慰问信
2015/11/30 职场文书
vue-element-admin项目导入和导出的实现
2021/05/21 Vue.js