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 04 Python
Python数据结构之双向链表的定义与使用方法示例
Jan 16 Python
使用Python写一个小游戏
Apr 02 Python
python 统计数组中元素出现次数并进行排序的实例
Jul 02 Python
使用python实现http及ftp服务进行数据传输的方法
Oct 26 Python
详解Python循环作用域与闭包
Mar 21 Python
python使用minimax算法实现五子棋
Jul 29 Python
python字符串的拼接方法总结
Nov 18 Python
Python3常见函数range()用法详解
Dec 30 Python
如何基于python对接钉钉并获取access_token
Apr 21 Python
python爬虫线程池案例详解(梨视频短视频爬取)
Feb 20 Python
Python3.8官网文档之类的基础语法阅读
Sep 04 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
支付宝服务窗API接口开发php版本
2016/07/20 PHP
Laravel 不同生产环境服务器的判断实践
2019/10/15 PHP
one.php 多项目、函数库、类库 统一为一个版本的方法
2020/08/24 PHP
js 数组操作代码集锦
2009/04/28 Javascript
如何让DIV可编辑、可拖动示例代码
2013/09/18 Javascript
JavaScript实现的图像模糊算法代码分享
2014/04/22 Javascript
JavaScript window.location对象
2014/11/14 Javascript
jQuery中even选择器的定义和用法
2014/12/23 Javascript
Jquery遍历Json数据的方法
2015/04/20 Javascript
jQuery中$(function() {});问题详解
2015/08/10 Javascript
input框中自动展示当前日期yyyy/mm/dd的实现方法
2017/07/06 Javascript
Vue-cli项目获取本地json文件数据的实例
2018/03/07 Javascript
微信小程序按钮点击跳转页面详解
2019/05/06 Javascript
react 中父组件与子组件双向绑定问题
2019/05/20 Javascript
鸿蒙系统中的 JS 开发框架
2020/09/18 Javascript
vue 页面跳转的实现方式
2021/01/12 Vue.js
简单讲解Python中的闭包
2015/08/11 Python
用Python解决计数原理问题的方法
2016/08/04 Python
python机器学习之神经网络(三)
2017/12/20 Python
python实现拉普拉斯特征图降维示例
2019/11/25 Python
使用Python制作新型冠状病毒实时疫情图
2020/01/28 Python
python 实现人和电脑猜拳的示例代码
2020/03/02 Python
Python利用Pillow(PIL)库实现验证码图片的全过程
2020/10/04 Python
Python学习工具jupyter notebook安装及用法解析
2020/10/23 Python
浅析border-radius如何兼容IE
2016/04/19 HTML / CSS
详解使用双缓存解决Canvas clearRect引起的闪屏问题
2019/04/29 HTML / CSS
HTML5 Canvas实现放大镜效果示例
2020/03/25 HTML / CSS
校长就职演讲稿
2014/01/06 职场文书
终止合同协议书
2014/04/17 职场文书
大学新闻系求职信
2014/06/03 职场文书
知识竞赛拉拉队口号
2014/06/16 职场文书
初中生考试作弊检讨书
2014/12/14 职场文书
公司保洁员管理制度
2015/08/04 职场文书
大学生团支书竞选稿
2015/11/21 职场文书
Pytorch 实现变量类型转换
2021/05/17 Python
python实现对doc、txt、xls等文档的读写操作
2022/04/02 Python