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中的eval()、exec()及其相关函数
Dec 20 Python
python编程实现随机生成多个椭圆实例代码
Jan 03 Python
在python3.5中使用OpenCV的实例讲解
Apr 02 Python
Python实现登陆文件验证方法
Oct 06 Python
解决Python plt.savefig 保存图片时一片空白的问题
Jan 10 Python
Django框架封装外部函数示例
May 28 Python
python如何读取bin文件并下发串口
Jul 05 Python
pandas读取CSV文件时查看修改各列的数据类型格式
Jul 07 Python
python3模拟实现xshell远程执行liunx命令的方法
Jul 12 Python
Python替换月份为英文缩写的实现方法
Jul 15 Python
python实现UDP协议下的文件传输
Mar 20 Python
详解pyqt5的UI中嵌入matplotlib图形并实时刷新(挖坑和填坑)
Aug 07 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采集利器 Snoopy 试用心得
2011/07/03 PHP
php获取网卡的MAC地址支持WIN/LINUX系统
2014/04/30 PHP
Laravel框架路由和控制器的绑定操作方法
2018/06/12 PHP
php使用goto实现自动重启swoole、reactphp、workerman服务的代码
2020/04/13 PHP
纯CSS打造的导航菜单(附jquery版)
2010/08/07 Javascript
Js实现双击鼠标自动滚动屏幕的示例代码
2013/12/14 Javascript
javascript获取浏览器类型和版本的方法(js获取浏览器版本)
2014/03/13 Javascript
javascript高级选择器querySelector和querySelectorAll全面解析
2016/04/07 Javascript
JS实现的哈夫曼编码示例【原始版与修改版】
2018/04/22 Javascript
Angular如何在应用初始化时运行代码详解
2018/06/11 Javascript
Vue中的Props(不可变状态)
2018/09/29 Javascript
深入浅析Vue中mixin和extend的区别和使用场景
2019/08/01 Javascript
js实现多个标题吸顶效果
2020/01/08 Javascript
Python删除指定目录下过期文件的2个脚本分享
2014/04/10 Python
python如何在循环引用中管理内存
2018/03/20 Python
tensorflow 加载部分变量的实例讲解
2018/07/27 Python
python并发编程多进程 模拟抢票实现过程
2019/08/20 Python
Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法
2019/09/24 Python
python GUI库图形界面开发之PyQt5窗口控件QWidget详细使用方法
2020/02/26 Python
python小白学习包管理器pip安装
2020/06/09 Python
Debenhams爱尔兰:英国知名的百货公司
2017/01/02 全球购物
专注澳大利亚特产和新西兰特产的澳洲中文网:0061澳洲制造
2019/03/24 全球购物
德国苹果商店:MacTrade
2020/05/18 全球购物
C#里面如何倒序排列一个数组的元素?
2013/06/21 面试题
Linux机考试题
2015/10/16 面试题
《狮子和兔子》教学反思
2014/03/02 职场文书
汇源肾宝广告词
2014/03/20 职场文书
法制宣传标语
2014/06/23 职场文书
护士节活动总结
2014/08/29 职场文书
烛光里的微笑观后感
2015/06/17 职场文书
六年级语文教学反思
2016/03/03 职场文书
如何用RabbitMQ和Swoole实现一个异步任务系统
2021/05/29 PHP
springboot利用redis、Redisson处理并发问题的操作
2021/06/18 Java/Android
Java中PriorityQueue实现最小堆和最大堆的用法
2021/06/27 Java/Android
Go语言实现一个简单的并发聊天室的项目实战
2022/03/18 Golang
Win11查看设备管理器
2022/04/19 数码科技