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判断字符串是否纯数字的方法
Nov 19 Python
django manage.py扩展自定义命令方法
May 27 Python
python 3.6.4 安装配置方法图文教程
Sep 18 Python
python 求一个列表中所有元素的乘积实例
Jun 11 Python
在Python中获取操作系统的进程信息
Aug 27 Python
python实现KNN分类算法
Oct 16 Python
flask框架自定义url转换器操作详解
Jan 25 Python
tensorflow实现读取模型中保存的值 tf.train.NewCheckpointReader
Feb 10 Python
Python Django view 两种return的实现方式
Mar 16 Python
python和node.js生成当前时间戳的示例
Sep 29 Python
python关于倒排列的知识点总结
Oct 13 Python
python用字节处理文件实例讲解
Apr 13 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
生成ubuntu自动切换壁纸xml文件的php代码
2010/07/17 PHP
PHP中使用smarty生成静态文件的例子
2014/04/24 PHP
php实现读取超大文件的方法
2014/07/28 PHP
2014最热门的24个php类库汇总
2014/12/18 PHP
PHP+Redis链表解决高并发下商品超卖问题(实现原理及步骤)
2020/08/03 PHP
一个简单的js鼠标划过切换效果
2010/06/30 Javascript
jQuery Ajax使用 全解析
2010/12/15 Javascript
页面js遇到乱码问题的解决方法是和无法转码的情况
2014/04/30 Javascript
一个极为简单的requirejs实现方法
2016/10/20 Javascript
Javascript中call,apply,bind方法的详解与总结
2016/12/12 Javascript
两种简单的跨域方法(jsonp、php)
2017/01/02 Javascript
AngularJS框架中的双向数据绑定机制详解【减少需要重复的开发代码量】
2017/01/19 Javascript
详解NodeJS框架express的路径映射(路由)功能及控制
2017/03/24 NodeJs
完美解决UI-Grid表格元素中多个空格显示为一个空格的问题
2017/04/25 Javascript
JS设计模式之惰性模式(二)
2017/09/29 Javascript
浅谈Angular文字折叠展开组件的原理分析
2017/11/24 Javascript
jquery实现垂直无限轮播的方法分析
2019/07/16 jQuery
JavaScript实现猜数字游戏
2020/05/20 Javascript
在Python 3中实现类型检查器的简单方法
2015/07/03 Python
名片管理系统python版
2018/01/11 Python
对json字符串与python字符串的不同之处详解
2018/12/19 Python
python根据文章标题内容自动生成摘要的实例
2019/02/21 Python
pandas针对excel处理的实现
2021/01/15 Python
three.js模拟实现太阳系行星体系功能
2019/09/03 HTML / CSS
巴西箱包、背包、钱包和旅行配件购物网站:Inovathi
2019/12/14 全球购物
俄罗斯披萨、寿司和面食送货到家服务:2 Берега
2019/12/15 全球购物
如何配置、使用和清除Smarty缓存
2015/12/23 面试题
工程管理造价应届生求职信
2013/11/13 职场文书
毕业生个人投资创业计划书
2014/01/04 职场文书
高中体育教学反思
2014/01/29 职场文书
办公室文员工作职责
2014/01/31 职场文书
国际经济与贸易专业大学生职业规划书
2014/03/01 职场文书
幼儿园亲子活动总结
2014/04/26 职场文书
会计电算化专业求职信
2014/06/10 职场文书
生物学专业求职信
2014/07/23 职场文书
CSS预处理框架——Stylus
2021/04/21 HTML / CSS