Python利用公共键如何对字典列表进行排序详解


Posted in Python onMay 19, 2018

前言

在程序中使用字典进行数据信息统计时,由于字典是无序的所以打印字典时内容也是无序的。因此,为了使统计得到的结果更方便查看需要进行排序。Python中字典的排序分为按“键”排序和按“值”排序。下面话不多说了,来一起看看详细的介绍吧

问题描述

我们有一个字典列表,想根据一个或多个字典中的值来对列表排序。

例如,有如下字典列表,根据字典中的x,由大到小排序这个列表:

l = [{'x':1, 'y':2}, {'x':2, 'y':3}, {'x':3, 'y':4}]

解决方案

排序用sorted内置函数,关键字key参数用lambda表达式取出字典中x值作为排序依据,关键字reverse参数设置为True用来由大到小降序排序。

>>> l = [{'x':1, 'y':2}, {'x':2, 'y':3}, {'x':3, 'y':4}]
>>> l1 = sorted(l, key=lambda d:d['x'], reverse=True)
>>> l1
[{'y': 4, 'x': 3}, {'y': 3, 'x': 2}, {'y': 2, 'x': 1}]
>>>

也可以用operator模块中的itemgetter函数取出字典中某个键的值,作为排序依据。

>>> from operator import itemgetter
>>> l = [{'x':1, 'y':2}, {'x':2, 'y':3}, {'x':3, 'y':4}]
>>> l2 = sorted(l, key=itemgetter('x'), reverse=True)
>>> l2
[{'y': 4, 'x': 3}, {'y': 3, 'x': 2}, {'y': 2, 'x': 1}]
>>>

讨论

函数operator.itemgetter()接受的参数可以作为查询的标记,它可以是字典的键名称、用数字表示的列表元素或是任何可以传给对象的__getitem__()方法的值。如果传多个标记给itemgetter() ,那么它产生的可调用对象将返回一个包含所有元素在内的元组,然后sorted()将根据对元组的排序结果来排列输出结果。如果想同时针对多个字段做排序(比如x和y),那么这是非常有用的。

有时候会用lambda表达式来取代itemgetter()的功能。例如:

l_by_x = sorted(l, key=lambda d:d['x'])
l_by_xy = sorted(l, key=lambda d:(d['x'], d['y']))

这种解决方案通常也能正常工作,但是用itemgetter()通常会运行得更快一些。因此如果要考虑性能问题的话,应该使用itemgetter()

l_by_x = sorted(l, key=itemgetter('x'))
l_by_xy = sorted(l, key=itemgetter('x', 'y'))

最后不要忘了本文中展示的技术同样适用于min()max()函数。例如:

>>> min(l, key=itemgetter('x'))
{'y': 2, 'x': 1}
>>> max(l, key=itemgetter('x', 'y'))
{'y': 4, 'x': 3}
>>> max(l, key=itemgetter('x'))
{'y': 4, 'x': 3}
>>>

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python实现简单的socket server实例
Apr 29 Python
在Python中操作文件之read()方法的使用教程
May 24 Python
Python selenium 三种等待方式解读
Sep 15 Python
Python序列循环移位的3种方法推荐
Apr 09 Python
对python添加模块路径的三种方法总结
Oct 16 Python
对Python Class之间函数的调用关系详解
Jan 23 Python
python实现图像检索的三种(直方图/OpenCV/哈希法)
Aug 08 Python
python内存管理机制原理详解
Aug 12 Python
简单了解Pandas缺失值处理方法
Nov 16 Python
开启Django博客的RSS功能的实现方法
Feb 17 Python
python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例
Apr 02 Python
python3 配置logging日志类的操作
Apr 08 Python
Python中一些不为人知的基础技巧总结
May 19 #Python
Python + selenium自动化环境搭建的完整步骤
May 19 #Python
pandas中去除指定字符的实例
May 18 #Python
pandas数据清洗,排序,索引设置,数据选取方法
May 18 #Python
对pandas replace函数的使用方法小结
May 18 #Python
基于DataFrame筛选数据与loc的用法详解
May 18 #Python
pandas DataFrame 根据多列的值做判断,生成新的列值实例
May 18 #Python
You might like
其他功能
2006/10/09 PHP
给初学者的30条PHP最佳实践(荒野无灯)
2011/08/02 PHP
php解析xml提示Invalid byte 1 of 1-byte UTF-8 sequence错误的处理方法
2013/11/14 PHP
60个很实用的jQuery代码开发技巧收集
2014/12/15 Javascript
JS函数定义方式的区别介绍
2016/03/22 Javascript
Angularjs过滤器使用详解
2016/05/25 Javascript
VC调用javascript的几种方法(推荐)
2016/08/09 Javascript
使用BootStrap实现用户登录界面UI
2016/08/10 Javascript
javascript history对象详解
2017/02/09 Javascript
基于mpvue的小程序项目搭建的步骤
2018/05/22 Javascript
Vue源码学习之关于对Array的数据侦听实现
2019/04/23 Javascript
Python判断变量是否已经定义的方法
2014/08/18 Python
python 计算两个日期相差多少个月实例代码
2017/05/24 Python
python 按照固定长度分割字符串的方法小结
2018/04/30 Python
Python操作word常见方法示例【win32com与docx模块】
2018/07/17 Python
opencv python 图像去噪的实现方法
2018/08/31 Python
在Python中关于使用os模块遍历目录的实现方法
2019/01/03 Python
python+Django实现防止SQL注入的办法
2019/10/31 Python
推荐8款常用的Python GUI图形界面开发框架
2020/02/23 Python
在CentOS7下安装Python3教程解析
2020/07/09 Python
Python实现数字的格式化输出
2020/08/01 Python
Python高阶函数与装饰器函数的深入讲解
2020/11/10 Python
python文件路径操作方法总结
2020/12/21 Python
韩国三星旗下的一家超市连锁店:Home Plus
2016/07/30 全球购物
如何写好升职自荐信
2014/01/06 职场文书
教师党员思想汇报
2014/01/06 职场文书
升旗仪式主持词
2014/03/19 职场文书
主题实践活动总结
2014/05/08 职场文书
优秀少先队工作者事迹材料
2014/05/13 职场文书
教师党员公开承诺事项
2014/05/28 职场文书
财产分割协议书范本
2014/11/03 职场文书
2015年社会治安综合治理工作总结
2015/04/10 职场文书
公安忠诚教育心得体会
2016/01/23 职场文书
MySQL中VARCHAR与CHAR格式数据的区别
2021/05/26 MySQL
使用Canvas绘制一个游戏人物属性图
2022/03/25 Javascript
python实现手机推送 代码也就10行左右
2022/04/12 Python