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实现简单状态框架的方法
Mar 19 Python
python简单文本处理的方法
Jul 10 Python
python爬取w3shcool的JQuery课程并且保存到本地
Apr 06 Python
python 异或加密字符串的实例
Oct 14 Python
使用python实现简单五子棋游戏
Jun 18 Python
python爬虫实现中英翻译词典
Jun 25 Python
python爬虫 基于requests模块发起ajax的get请求实现解析
Aug 20 Python
python cv2在验证码识别中应用实例解析
Dec 25 Python
Python 中@property的用法详解
Jan 15 Python
python3+selenium获取页面加载的所有静态资源文件链接操作
May 04 Python
Python自动化xpath实现自动抢票抢货
Sep 19 Python
Jupyter Notebook 远程访问配置详解
Jan 11 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 函数语法介绍一
2009/06/14 PHP
PHP 获取客户端真实IP地址多种方法小结
2010/05/15 PHP
php多文件上传实现代码
2014/02/20 PHP
PHP实现的简易版图片相似度比较
2015/01/07 PHP
js弹出确认是否删除对话框
2014/03/27 Javascript
JavaScript实现三阶幻方算法谜题解答
2014/12/29 Javascript
javascript结合fileReader 实现上传图片
2015/01/30 Javascript
jQuery及JS实现循环中暂停的方法
2015/02/02 Javascript
jQuery实现加入购物车飞入动画效果
2015/03/14 Javascript
javascript获取重复次数最多的字符
2015/07/08 Javascript
Nodejs的express使用教程
2015/11/23 NodeJs
jquery遍历函数siblings()用法实例
2015/12/24 Javascript
js实现各种复制到剪贴板的方法(分享)
2016/10/27 Javascript
HTML中使背景图片自适应浏览器大小实例详解
2017/04/06 Javascript
AngularJS实现的JSONP跨域访问数据传输功能详解
2017/07/20 Javascript
JS对象与JSON互转换、New Function()、 forEach()、DOM事件流等js开发基础小结
2017/08/10 Javascript
详解VueRouter进阶之导航钩子和路由元信息
2017/09/13 Javascript
微信小程序实现全局搜索代码高亮的示例
2018/03/30 Javascript
Node.js 使用axios读写influxDB的方法示例
2018/10/26 Javascript
从源码里了解vue中的nextTick的使用
2018/11/22 Javascript
webpack配置proxyTable时pathRewrite无效的解决方法
2018/12/13 Javascript
js实现一个页面多个倒计时的3种方法
2019/02/25 Javascript
微信小程序第三方框架对比 之 wepy / mpvue / taro
2019/04/10 Javascript
Vue组件通信的几种实现方法
2019/04/25 Javascript
[01:06:54]DOTA2-DPC中国联赛 正赛 RNG vs Dragon BO3 第一场 1月24日
2021/03/11 DOTA
python使用标准库根据进程名如何获取进程的pid详解
2017/10/31 Python
pycharm 配置远程解释器的方法
2018/10/28 Python
django template实现定义临时变量,自定义赋值、自增实例
2020/07/12 Python
Python importlib模块重载使用方法详解
2020/10/13 Python
美术师范毕业生自荐信
2013/11/16 职场文书
上级检查欢迎词
2014/01/18 职场文书
电子银行业务授权委托书
2014/10/10 职场文书
公务员党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
2014年仓库保管员工作总结
2014/12/03 职场文书
2014年残疾人工作总结
2014/12/06 职场文书
react如何快速设置文件路径别名
2021/04/28 Javascript