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批量修改文件名的实现代码
Sep 01 Python
python实现简单的TCP代理服务器
Oct 08 Python
Python中List.count()方法的使用教程
May 20 Python
python冒泡排序简单实现方法
Jul 09 Python
python 二分查找和快速排序实例详解
Oct 13 Python
python获取微信小程序手机号并绑定遇到的坑
Nov 19 Python
Python3.7 新特性之dataclass装饰器
May 27 Python
python字符串查找函数的用法详解
Jul 08 Python
我们为什么要减少Python中循环的使用
Jul 10 Python
django使用haystack调用Elasticsearch实现索引搜索
Jul 24 Python
python__name__原理及用法详解
Nov 02 Python
基于python图像处理API的使用示例
Apr 03 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/js获取客户端mac地址的实现代码
2013/07/08 PHP
PHP+jquery实时显示网站在线人数的方法
2015/01/04 PHP
php上传图片获取路径及给表单字段赋值的方法
2016/01/23 PHP
PHP中16个高危函数整理
2019/09/19 PHP
JS中字符问题(二进制/十进制/十六进制及ASCII码之间的转换)
2008/11/03 Javascript
jquery动态加载图片数据练习代码
2011/08/04 Javascript
javascript学习笔记(十七) 检测浏览器插件代码
2012/06/20 Javascript
js和html5实现手机端刮刮卡抽奖效果完美兼容android/IOS
2013/11/18 Javascript
JS高级调试技巧:捕获和分析 JavaScript Error详解
2014/03/16 Javascript
Mac OS X 系统下安装和部署Egret引擎开发环境
2014/09/03 Javascript
浅谈使用splice函数对数组中的元素进行删除时的注意事项
2016/12/04 Javascript
JS常见疑难点分析之match,charAt,charCodeAt,map,search用法分析
2016/12/25 Javascript
Javascript基础回顾之(二) js作用域
2017/01/31 Javascript
jQuery zTree树插件动态加载实例代码
2017/05/11 jQuery
JavaScript原型继承和原型链原理详解
2020/02/04 Javascript
JQuery Ajax如何实现注册检测用户名
2020/09/25 jQuery
Nuxt的路由配置和参数传递方式
2020/11/06 Javascript
JavaScript实现HTML导航栏下拉菜单
2020/11/25 Javascript
对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解
2018/06/28 Python
pytorch中tensor的合并与截取方法
2018/07/26 Python
解决django同步数据库的时候app models表没有成功创建的问题
2019/08/09 Python
Django Form and ModelForm的区别与使用
2019/12/06 Python
tensorflow实现tensor中满足某一条件的数值取出组成新的tensor
2020/01/04 Python
python获取整个网页源码的方法
2020/08/03 Python
详解numpy.ndarray.reshape()函数的参数问题
2020/10/13 Python
阿波罗盒子:Apollo Box
2017/08/14 全球购物
管理科学大学生求职信
2013/11/13 职场文书
国际贸易个人求职信范文
2014/01/04 职场文书
自我鉴定四大框架
2014/01/17 职场文书
职工运动会邀请函
2014/02/02 职场文书
青年教师培训方案
2014/02/06 职场文书
小学英语教师先进事迹
2014/05/28 职场文书
中学学校门卫岗位职责
2014/08/15 职场文书
python数据库批量插入数据的实现(executemany的使用)
2021/04/30 Python
Python Pandas常用函数方法总结
2021/06/15 Python
MySQL面试题讲解之如何设置Hash索引
2021/11/01 MySQL