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 相关文章推荐
使用go和python递归删除.ds store文件的方法
Jan 22 Python
Python yield 使用浅析
May 28 Python
Python实现图片尺寸缩放脚本
Mar 10 Python
python3 读写文件换行符的方法
Apr 09 Python
在Python dataframe中出生日期转化为年龄的实现方法
Oct 20 Python
用Pytorch训练CNN(数据集MNIST,使用GPU的方法)
Aug 19 Python
详解python路径拼接os.path.join()函数的用法
Oct 09 Python
jupyter notebook的安装与使用详解
May 18 Python
使用opencv识别图像红色区域,并输出红色区域中心点坐标
Jun 02 Python
python opencv实现简易画图板
Aug 27 Python
如何利用python检测图片是否包含二维码
Oct 15 Python
Python Selenium库的基本使用教程
Jan 04 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
Base64在线编码解码实现代码 演示与下载
2011/01/08 PHP
Zend Studio (eclipse)使用速度优化方法
2011/03/23 PHP
PHP中使用curl伪造IP的简单方法
2015/08/07 PHP
php bootstrap实现简单登录
2016/03/08 PHP
Yii数据库缓存实例分析
2016/03/29 PHP
Yii2.0框架实现带分页的多条件搜索功能示例
2019/02/20 PHP
jQuery 1.2.x 升? 1.3.x 注意事项
2009/05/06 Javascript
IE6、IE7中setAttribute不支持class/for/rowspan/colspan等属性
2011/08/28 Javascript
iframe父页面获取子页面参数的方法
2014/02/21 Javascript
javascript实现的全国省市县无刷新多级关联菜单效果代码
2016/08/01 Javascript
Vue编写多地区选择组件
2017/08/21 Javascript
VueJs使用Amaze ui调整列表和内容页面
2017/11/30 Javascript
基于JavaScript实现简单的音频播放功能
2018/01/07 Javascript
使用vue-infinite-scroll实现无限滚动效果
2018/06/22 Javascript
axios使用拦截器统一处理所有的http请求的方法
2018/11/02 Javascript
vue-better-scroll 的使用实例代码详解
2018/12/03 Javascript
JS利用prototype给类添加方法操作详解
2019/06/21 Javascript
在Layui中操作数据表格,给指定单元格添加事件示例
2019/10/26 Javascript
微信小程序动态设置图片大小的方法
2019/11/21 Javascript
Javascript实现鼠标点击冒泡特效
2019/12/24 Javascript
JavaScript canvas实现文字时钟
2021/01/10 Javascript
django实现分页的方法
2015/05/26 Python
Python使用QRCode模块生成二维码实例详解
2017/06/14 Python
python 中文件输入输出及os模块对文件系统的操作方法
2018/08/27 Python
Python Opencv实现图像轮廓识别功能
2020/03/23 Python
Scrapy框架实现的登录网站操作示例
2020/02/06 Python
Django 实现对已存在的model进行更改
2020/03/28 Python
Python3实现个位数字和十位数字对调, 其乘积不变
2020/05/03 Python
Python 读取位于包中的数据文件
2020/08/07 Python
贝玲妃美国官方网站:Benefit美国
2016/08/28 全球购物
凯特王妃父母建立的派对用品网站:Party Pieces
2017/05/28 全球购物
拉斯维加斯酒店、演出、旅游、俱乐部及更多:Vegas.com
2019/02/28 全球购物
大学生青年志愿者活动总结
2015/05/06 职场文书
springboot集成flyway自动创表的详细配置
2021/06/26 Java/Android
vue二维数组循环嵌套方式 循环数组、循环嵌套数组
2022/04/24 Vue.js
Windows Server 2019 配置远程控制以及管理方法
2022/04/28 Servers