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 25 Python
AI人工智能 Python实现人机对话
Nov 13 Python
Python实现批量压缩图片
Jan 25 Python
解决pycharm 误删掉项目文件的处理方法
Oct 22 Python
配置 Pycharm 默认 Test runner 的图文教程
Nov 30 Python
python解释器spython使用及原理解析
Aug 24 Python
使用python计算三角形的斜边例子
Apr 15 Python
Python虚拟环境库virtualenvwrapper安装及使用
Jun 17 Python
Pytest实现setup和teardown的详细使用详解
Apr 17 Python
python numpy中multiply与*及matul 的区别说明
May 26 Python
Python数据可视化之用Matplotlib绘制常用图形
Jun 03 Python
pytorch分类模型绘制混淆矩阵以及可视化详解
Apr 07 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
Windows下Apache + PHP SESSION丢失的解决过程全纪录
2015/04/07 PHP
php实现文章置顶功能的方法
2016/10/20 PHP
laravel框架数据库配置及操作数据库示例
2019/10/10 PHP
javascript事件问题
2009/09/05 Javascript
jQuery中需要注意的细节问题小结
2011/12/06 Javascript
js关闭父窗口时关闭子窗口
2013/04/01 Javascript
基于豆瓣API+Angular开发的web App
2015/01/02 Javascript
jquery html动态添加的元素绑定事件详解
2016/05/24 Javascript
jQuery的ajax下载blob文件
2016/07/21 Javascript
jQuery stop()用法实例详解
2016/07/28 Javascript
ionic2 tabs 图标自定义实例
2017/03/08 Javascript
angular.js指令中transclude选项及ng-transclude指令详解
2017/05/24 Javascript
JSON在Javascript中的使用(eval和JSON.parse的区别)详细解析
2017/09/05 Javascript
jquery中有哪些api jQuery主要API
2017/11/20 jQuery
angularJs提交文本框数据到后台的方法
2018/10/08 Javascript
[01:20]2018DOTA2亚洲邀请赛总决赛战队Mineski晋级之路
2018/04/07 DOTA
Python去掉字符串中空格的方法
2014/03/11 Python
Python 时间操作例子和时间格式化参数小结
2014/04/24 Python
python文件读写操作与linux shell变量命令交互执行的方法
2015/01/14 Python
Python操作MySQL数据库9个实用实例
2015/12/11 Python
python基于itchat实现微信群消息同步机器人
2017/02/27 Python
Python多线程实现同步的四种方式
2017/05/02 Python
基于Python闭包及其作用域详解
2017/08/28 Python
20行python代码的入门级小游戏的详解
2019/05/05 Python
python里反向传播算法详解
2020/11/22 Python
史上最详细的Python打包成exe文件教程
2021/01/17 Python
前端实现弹幕效果的方法总结(包含css3和canvas的实现方式)
2018/07/12 HTML / CSS
HomeAway澳大利亚:预订你的度假屋,公寓、度假村、别墅等
2019/02/20 全球购物
Farfetch巴西官网:奢侈品牌时尚购物平台
2020/10/19 全球购物
施工班组长岗位职责
2014/01/05 职场文书
电气自动化个人求职信范文
2014/02/03 职场文书
元旦标语大全
2014/10/09 职场文书
母亲节寄语大全
2015/02/27 职场文书
个人求职意向书
2015/05/11 职场文书
竞聘演讲报告:基本写作有哪些?附开头范文
2019/10/16 职场文书
golang 生成对应的数据表struct定义操作
2021/04/28 Golang