python复合条件下的字典排序

作者:天元浪子 时间:2022-10-13 20:07:34 

知乎上有人说,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]['英语']
 ))
['白星瑶', '李妍可', '吴诗涵', '庄嘉顺', '邬胜杰']

来源:https://xufive.blog.csdn.net/article/details/108978408

标签:python,字典排序
0
投稿

猜你喜欢

  • Mysql彻底解决中文乱码问题的方案(Illegal mix of collations for operation)

    2024-01-26 16:33:51
  • 如何关掉pycharm中的python console(图解)

    2023-01-28 05:54:35
  • 打造设计你自己的字体 Ⅱ

    2008-03-14 07:48:00
  • Python爬虫基于lxml解决数据编码乱码问题

    2021-09-11 23:48:44
  • 利用Python发送邮件或发带附件的邮件

    2023-01-17 12:40:31
  • 一篇文章带你了解kali局域网攻击

    2022-02-21 23:53:35
  • Python办公自动化之Excel介绍

    2021-04-19 11:06:07
  • Python图像处理库PIL详细使用说明

    2021-10-14 17:43:44
  • python开发之Docker入门安装部署教程

    2022-12-08 18:31:28
  • PHP实现获取两个以逗号分割的字符串的并集

    2023-06-01 03:24:53
  • Windows下MySQL8.0.11社区绿色版安装步骤图解

    2024-01-14 23:02:34
  • 教你利用Selenium+python自动化来解决pip使用异常

    2022-11-17 18:49:08
  • 微信跳一跳php代码实现

    2024-06-05 09:46:20
  • Bootstrap table学习笔记(2) 前后端分页模糊查询

    2024-04-29 13:12:22
  • Python最基本的数据类型以及对元组的介绍

    2022-03-26 07:04:07
  • python进阶之自定义可迭代的类

    2022-09-20 10:18:48
  • 利用Python实现读取Word文档里的Excel附件

    2022-01-21 11:28:18
  • 鼠标放在图片上显示大图的JS代码

    2024-04-28 10:20:08
  • 15行Python代码带你轻松理解令牌桶算法

    2021-05-05 01:18:05
  • python reverse反转部分数组的实例

    2021-09-16 05:30:11
  • asp之家 网络编程 m.aspxhome.com