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 31 Python
仅利用30行Python代码来展示X算法
Apr 01 Python
Python实现曲线点抽稀算法的示例
Oct 12 Python
Python实现对字典分别按键(key)和值(value)进行排序的方法分析
Dec 19 Python
django 自定义过滤器的实现
Feb 26 Python
容易被忽略的Python内置类型
Sep 03 Python
Python读取ini配置文件传参的简单示例
Jan 05 Python
python uuid生成唯一id或str的最简单案例
Jan 13 Python
matplotlib之多边形选区(PolygonSelector)的使用
Feb 24 Python
python 三边测量定位的实现代码
Apr 22 Python
Python办公自动化之教你如何用Python将任意文件转为PDF格式
Jun 28 Python
python实现局部图像放大
Nov 17 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加MYSQL服务器
2006/10/09 PHP
php实现字符串反转输出的方法
2015/03/14 PHP
PHP中set_include_path()函数相关用法分析
2016/07/18 PHP
Fleaphp常见函数功能与用法示例
2016/11/15 PHP
PHP用PDO如何封装简单易用的DB类详解
2017/07/30 PHP
PHP钩子与简单分发方式实例分析
2017/09/04 PHP
function, new function, new Function之间的区别
2007/03/08 Javascript
JavaScript 浮点数运算 精度问题
2009/10/06 Javascript
jQuery EasyUI API 中文文档 - ComboGrid 组合表格
2011/10/13 Javascript
JavaScipt中栈的实现方法
2016/02/17 Javascript
javascript中的 object 和 function小结
2016/08/14 Javascript
「中高级前端面试」JavaScript手写代码无敌秘籍(推荐)
2019/04/08 Javascript
javascript使用链接跨域下载图片
2019/11/01 Javascript
jquery实现吸顶导航效果
2020/01/08 jQuery
vue实现自定义多选按钮
2020/07/16 Javascript
[02:23]1个至宝=115个英雄特效 最“绿”至宝拉比克“魔导师密钥”登场
2018/12/29 DOTA
python实现ftp客户端示例分享
2014/02/17 Python
python解决网站的反爬虫策略总结
2016/10/26 Python
[原创]windows下Anaconda的安装与配置正解(Anaconda入门教程)
2018/04/05 Python
python使用for循环计算0-100的整数的和方法
2019/02/01 Python
Python实现字符串匹配的KMP算法
2019/04/04 Python
python3.4+pycharm 环境安装及使用方法
2019/06/13 Python
详解Python3中的 input() 函数
2020/03/18 Python
python argparse模块通过后台传递参数实例
2020/04/20 Python
css3弹性盒模型(Flexbox)详细介绍
2014/10/08 HTML / CSS
AmazeUI中模态框的实现
2020/08/19 HTML / CSS
临床医学大学生求职信
2013/09/28 职场文书
淘宝客服自我总结鉴定
2014/01/25 职场文书
电脑销售顾问自荐信
2014/01/29 职场文书
国际语言毕业生求职信
2014/07/08 职场文书
高一课前三分钟演讲稿
2014/09/13 职场文书
学习雷锋精神倡议书
2015/04/27 职场文书
毕业论文致谢格式模板
2015/05/14 职场文书
初一数学教学反思
2016/02/17 职场文书
MYSQL(电话号码,身份证)数据脱敏的实现
2021/05/28 MySQL
MongoDB日志切割的三种方式总结
2021/09/15 MongoDB