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的判断语句模拟三目运算
Apr 24 Python
详解Python中的strftime()方法的使用
May 22 Python
剖析Python的Tornado框架中session支持的实现代码
Aug 21 Python
详解Python函数作用域的LEGB顺序
May 14 Python
python实现给微信公众号发送消息的方法
Jun 30 Python
python统计多维数组的行数和列数实例
Jun 23 Python
python 执行文件时额外参数获取的实例
Dec 18 Python
Python 3.8正式发布,来尝鲜这些新特性吧
Oct 15 Python
解决TensorFlow GPU版出现OOM错误的问题
Feb 03 Python
在Mac中配置Python虚拟环境过程解析
Jun 22 Python
python根据字典的键来删除元素的方法
Aug 16 Python
python识别验证码的思路及解决方案
Sep 13 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
咖啡因含量是由谁决定的?低因咖啡怎么来?低因咖啡适合什么人喝
2021/03/06 新手入门
php连接mysql数据库代码
2009/03/10 PHP
php一句话cmdshell新型 (非一句话木马)
2009/04/18 PHP
PHP生成图片验证码功能示例
2017/01/12 PHP
javascript中删除指定数组中指定的元素的代码
2011/02/12 Javascript
Javascript继承(上)——对象构建介绍
2012/11/08 Javascript
左侧是表头的JS表格控件(自写,网上没有的)
2013/06/04 Javascript
Javascript拓展String方法小结
2013/07/08 Javascript
简单的代码实现jquery定时器
2014/01/03 Javascript
JavaScript在IE和FF下的兼容性问题
2014/05/19 Javascript
JavaScript实现为指定对象添加多个事件处理程序的方法
2015/04/17 Javascript
jQuery获取单击节点对象的方法
2016/06/02 Javascript
JS获取随机数和时间转换的简单实例
2016/07/10 Javascript
使用jQuery.Qrcode插件在客户端动态生成二维码并添加自定义Logo
2016/09/01 Javascript
纯js三维数组实现三级联动效果
2017/02/07 Javascript
在vue中,v-for的索引index在html中的使用方法
2018/03/06 Javascript
JS中Promise函数then的奥秘探究
2018/07/30 Javascript
Nuxt项目支持eslint+pritter+typescript的实现
2019/05/20 Javascript
ligerUI的ligerDialog关闭刷新的方法
2019/09/27 Javascript
浅谈vue获得后台数据无法显示到table上面的坑
2020/08/13 Javascript
vue 封装面包屑组件教程
2020/11/16 Javascript
[05:08]第一届“网鱼杯”DOTA2比赛精彩集锦
2014/09/05 DOTA
Python安装第三方库的3种方法
2015/06/21 Python
基于python时间处理方法(详解)
2017/08/14 Python
Python 使用Numpy对矩阵进行转置的方法
2019/01/28 Python
Python二叉搜索树与双向链表转换算法示例
2019/03/02 Python
python增加图像对比度的方法
2019/07/12 Python
Python 进程操作之进程间通过队列共享数据,队列Queue简单示例
2019/10/11 Python
python ssh 执行shell命令的示例
2020/09/29 Python
Python requests HTTP验证登录实现流程
2020/11/05 Python
pycharm 关闭search everywhere的解决操作
2021/01/15 Python
手把手教你用Django执行原生SQL的方法
2021/02/18 Python
澳大利亚排名第一的狂热牛仔品牌:ONETEASPOON
2018/11/20 全球购物
应届生人事助理求职信
2013/11/09 职场文书
Python趣味实战之手把手教你实现举牌小人生成器
2021/06/07 Python
浅析Django接口版本控制
2021/06/26 Python