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分析apache访问日志脚本分享
Feb 26 Python
Python中自定义函数的教程
Apr 27 Python
基于Python如何使用AIML搭建聊天机器人
Jan 27 Python
python读取oracle函数返回值
Jul 18 Python
儿童编程python入门
May 08 Python
TensorFlow的权值更新方法
Jun 14 Python
Django 视图层(view)的使用
Nov 09 Python
Python中请不要再用re.compile了
Jun 30 Python
Python3.7安装keras和TensorFlow的教程图解
Jun 18 Python
Python列表倒序输出及其效率详解
Mar 04 Python
Python with语句用法原理详解
Jul 03 Python
用Python 爬取猫眼电影数据分析《无名之辈》
Jul 24 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生成带有雪花背景的验证码
2008/09/28 PHP
PHP中file_put_contents追加和换行的实现方法
2017/04/01 PHP
详解如何在云服务器上部署Laravel
2017/06/30 PHP
yii框架redis结合php实现秒杀效果(实例代码)
2017/10/26 PHP
laravel 事件/监听器实例代码
2019/04/12 PHP
用js解决数字不能换行问题
2010/08/10 Javascript
js螺旋动画效果的具体实例
2013/11/15 Javascript
自编jQuery插件实现模拟alert和confirm
2014/09/01 Javascript
javascript中使用正则表达式清理table样式的代码
2020/04/01 Javascript
js实现可折叠展开的手风琴菜单效果
2015/09/07 Javascript
深入浅析JavaScript中的constructor
2016/04/19 Javascript
js替换字符串中所有指定的字符(实现代码)
2016/08/17 Javascript
微信小程序 Storage API实例详解
2016/10/02 Javascript
基于原生js淡入淡出函数封装(兼容IE)
2016/10/20 Javascript
jQuery设置和获取select、checkbox、radio的选中值方法
2017/01/01 Javascript
JS获得多个同name 的input输入框的值的实现方法
2017/01/09 Javascript
基于vue.js路由参数的实例讲解——简单易懂
2017/09/07 Javascript
微信小程序中实现手指缩放图片的示例代码
2018/03/13 Javascript
深入理解Node module模块
2018/03/26 Javascript
解决前后端分离 vue+springboot 跨域 session+cookie失效问题
2019/05/13 Javascript
原生js实现随机点餐效果
2019/12/10 Javascript
[02:41]辉夜杯现场一家三口 “我爸玩风行 我玩血魔”
2015/12/27 DOTA
Python实现的选择排序算法原理与用法实例分析
2017/11/22 Python
python matplotlib画图实例代码分享
2017/12/27 Python
python 遍历列表提取下标和值的实例
2018/12/25 Python
python实现爬取百度图片的方法示例
2019/07/06 Python
python join方法使用详解
2019/07/30 Python
css3背景图片透明叠加属性cross-fade简介及用法实例
2013/01/08 HTML / CSS
CSS3实现水平居中、垂直居中、水平垂直居中的实例代码
2020/02/27 HTML / CSS
Lentiamo丹麦:购买便宜的隐形眼镜
2021/01/13 全球购物
初二政治教学反思
2014/01/12 职场文书
本溪水洞导游词
2015/02/11 职场文书
2015年食堂工作总结报告
2015/04/23 职场文书
《叶问2》观后感
2015/06/15 职场文书
nginx优化的六点方法
2021/03/31 Servers
Python初学者必备的文件读写指南
2021/06/23 Python