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小技巧之批量抓取美女图片
Jun 06 Python
详解Python中内置的NotImplemented类型的用法
Mar 31 Python
对于Python的Django框架部署的一些建议
Apr 09 Python
用Python配平化学方程式的方法
Jul 20 Python
django fernet fields字段加密实践详解
Aug 12 Python
Python使用matplotlib绘制三维参数曲线操作示例
Sep 10 Python
基于Python计算圆周率pi代码实例
Mar 25 Python
Expected conditions模块使用方法汇总代码解析
Aug 13 Python
Pytest单元测试框架如何实现参数化
Sep 05 Python
Python 实现3种回归模型(Linear Regression,Lasso,Ridge)的示例
Oct 15 Python
python安装sklearn模块的方法详解
Nov 28 Python
PyQt5爬取12306车票信息程序的实现
May 14 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
PHP中路径问题的解决方案
2006/10/09 PHP
php添加文章时生成静态HTML文章的实现代码
2013/02/17 PHP
php 伪造ip以及url来路信息方法汇总
2014/11/25 PHP
jQuery 位置插件
2008/12/25 Javascript
Js,alert出现乱码问题的解决方法
2013/06/19 Javascript
解析JavaScript中的标签语句
2013/06/19 Javascript
file控件选择上传文件确定后触发的js事件是哪个
2014/03/17 Javascript
浅析JS原型继承与类的继承
2016/04/07 Javascript
jQuery根据表单name获取值的方法
2016/05/24 Javascript
修改js confirm alert 提示框文字的简单实例
2016/06/10 Javascript
购物车前端开发(jQuery和bootstrap3)
2016/08/27 Javascript
JS编写函数实现对身份证号码最后一位的验证功能
2016/12/29 Javascript
Vue2.0权限树组件实现代码
2017/08/29 Javascript
jquery中ajax请求后台数据成功后既不执行success也不执行error的完美解决方法
2017/12/24 jQuery
微信小程序仿微信运动步数排行(交互)
2018/07/13 Javascript
jQuery实现ajax的嵌套请求案例分析
2019/02/16 jQuery
vue实现输入一位数字转汉字功能
2019/12/13 Javascript
JavaScript this使用方法图解
2020/02/04 Javascript
jquery更改元素属性attr()方法操作示例
2020/05/22 jQuery
微信小程序视频弹幕发送功能的实现
2020/12/28 Javascript
解决Python 遍历字典时删除元素报异常的问题
2016/09/11 Python
Python中的探索性数据分析(功能式)
2017/12/22 Python
pandas string转dataframe的方法
2018/04/11 Python
tensorflow更改变量的值实例
2018/07/30 Python
Python3安装Pillow与PIL的方法
2019/04/03 Python
Python 3 实现定义跨模块的全局变量和使用教程
2019/07/07 Python
python集合常见运算案例解析
2019/10/17 Python
基于Python爬虫采集天气网实时信息
2020/06/05 Python
python 实现aes256加密
2020/11/27 Python
水芝澳美国官网:H2O Plus
2016/10/15 全球购物
2014年社区学雷锋活动总结
2014/03/09 职场文书
光信息科学与技术专业职业生涯规划
2014/03/13 职场文书
2016应届毕业生实习评语
2015/12/01 职场文书
详解vue中v-for的key唯一性
2021/05/15 Vue.js
Oracle配置dblink访问PostgreSQL的操作方法
2022/03/21 PostgreSQL
Python+Tkinter制作专属图形化界面
2022/04/01 Python