Python利用operator模块实现对象的多级排序详解


Posted in Python onMay 09, 2017

前言

最近在工作中碰到一个小的排序问题,需要按嵌套对象的多个属性来排序,于是发现了Python里的operator模块和sorted函数组合可以实现这个功能。本文介绍了Python用operator模块实现对象的多级排序的相关内容,分享出来供大家参考学习,下面来看看详细的介绍:

比如我有如下的类关系,A对象引用了一个B对象,

class A(object):
 def __init__(self, b):
  self.b = b
 def __str__(self):
  return "[%s, %s, %s]" % (self.b.attr1, self.b.attr2, self.b.attr3)
 def __repr__(self):
  return "[%s, %s, %s]" % (self.b.attr1, self.b.attr2, self.b.attr3)

class B(object):
 def __init__(self, attr1, attr2, attr3):
  self.attr1 = attr1
  self.attr2 = attr2
  self.attr3 = attr3
 def __str__(self):
  return "[%s, %s, %s]" % (self.attr1, self.attr2, self.attr3)
 def __repr__(self):
  return "[%s, %s, %s]" % (self.attr1, self.attr2, self.attr3)

下面是测试排序代码,这里是按照A对象的内嵌对象B的attr2和attr3属性来排序。

from operator import itemgetter, attrgetter

a1 = A(B('u1', 'AAA', 100))
a2 = A(B('u2', 'BBB', 100))
a3 = A(B('u3', 'BBB', 10))
aaa = (a1, a2, a3,)

print sorted(aaa, key=attrgetter('b.attr2', 'b.attr3'))
print sorted(aaa, key=attrgetter('b.attr2', 'b.attr3'), reverse=True)

运行上面的测试,结果如下:

[[u1, AAA, 100], [u3, BBB, 10], [u2, BBB, 100]]
[[u2, BBB, 100], [u3, BBB, 10], [u1, AAA, 100]]

那么,如果我需要先按b.attr2正序,再按b.attr3倒序来排序,可以使用下面组合来实现:

s = sorted(aaa, key=attrgetter('b.attr3'), reverse=True)
s = sorted(s, key=attrgetter('b.attr2'))
print s

运行结果如下:

[[u1, AAA, 100], [u2, BBB, 100], [u3, BBB, 10]]

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python正则表达式修复网站文章字体不统一的解决方法
Feb 21 Python
在树莓派2或树莓派B+上安装Python和OpenCV的教程
Mar 30 Python
Python向日志输出中添加上下文信息
May 24 Python
Python基于lxml模块解析html获取页面内所有叶子节点xpath路径功能示例
May 16 Python
Python爬虫实现简单的爬取有道翻译功能示例
Jul 13 Python
对Python _取log的几种方式小结
Jul 25 Python
django 数据库连接模块解析及简单长连接改造方法
Aug 29 Python
python框架flask表单实现详解
Nov 04 Python
Python Django2 model 查询介绍(条件、范围、模糊查询)
Mar 16 Python
详解Python中list[::-1]的几种用法
Nov 16 Python
tensorflow2.0教程之Keras快速入门
Feb 20 Python
python解析json数据
Apr 29 Python
网站渗透常用Python小脚本查询同ip网站
May 08 #Python
Python获取当前路径实现代码
May 08 #Python
Django自定义分页与bootstrap分页结合
Feb 22 #Python
利用python写个下载teahour音频的小脚本
May 08 #Python
通过源码分析Python中的切片赋值
May 08 #Python
Python对文件和目录进行操作的方法(file对象/os/os.path/shutil 模块)
May 08 #Python
Python实现Windows和Linux之间互相传输文件(文件夹)的方法
May 08 #Python
You might like
php自定义函数之递归删除文件及目录
2010/08/08 PHP
php学习笔记之面向对象编程
2012/12/29 PHP
用php随机生成福彩双色球号码的2种方法
2013/02/04 PHP
PHP实现微信图片上传到服务器的方法示例
2017/06/29 PHP
PHP策略模式定义与用法示例
2017/07/27 PHP
PHP使用ActiveMQ实例
2018/02/05 PHP
限制文本框输入N个字符的js代码
2010/05/13 Javascript
js/jquery获取浏览器窗口可视区域高度和宽度以及滚动条高度实现代码
2012/12/17 Javascript
js替换字符串的所有示例代码
2013/07/23 Javascript
jquery清空表单数据示例分享
2014/02/13 Javascript
javascript刷新父页面的各种方法汇总
2014/09/03 Javascript
如何屏蔽防止别的网站嵌入框架代码
2015/08/24 Javascript
详解javascript new的运行机制
2016/01/26 Javascript
javascript特效实现——当前时间和倒计时效果的简单实例
2016/07/20 Javascript
微信小程序 本地数据存储实例详解
2017/04/13 Javascript
用vue的双向绑定简单实现一个todo-list的示例代码
2017/08/03 Javascript
vue.js开发实现全局调用的MessageBox组件实例代码
2017/11/22 Javascript
JavaScript引用类型Function实例详解
2018/08/09 Javascript
使用vue2.6实现抖音【时间轮盘】屏保效果附源码
2019/04/24 Javascript
微信小程序事件流原理解析
2019/11/27 Javascript
利用js canvas实现五子棋游戏
2020/10/11 Javascript
[16:21]教你分分钟做大人:圣堂刺客
2014/12/03 DOTA
Python判断Abundant Number的方法
2015/06/15 Python
Python自动登录126邮箱的方法
2015/07/10 Python
django使用LDAP验证的方法示例
2018/12/10 Python
Python 编程速成(推荐)
2019/04/15 Python
pandas中的series数据类型详解
2019/07/06 Python
Python如何安装第三方模块
2020/05/28 Python
python boto和boto3操作bucket的示例
2020/10/30 Python
非常漂亮的CSS3百叶窗焦点图动画
2016/02/24 HTML / CSS
美国著名的团购网站:Woot
2016/08/02 全球购物
Waterford美国官网:爱尔兰水晶制品品牌
2017/04/26 全球购物
村级环境卫生整治方案
2014/05/04 职场文书
财务助理岗位职责范本
2014/10/09 职场文书
2014年消防工作总结
2014/11/21 职场文书
python可视化大屏库big_screen示例详解
2021/11/23 Python