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字符串连接方式汇总
Aug 21 Python
python中requests模块的使用方法
Apr 08 Python
python xml.etree.ElementTree遍历xml所有节点实例详解
Dec 04 Python
正确理解python中的关键字“with”与上下文管理器
Apr 21 Python
Python遍历某目录下的所有文件夹与文件路径
Mar 15 Python
Python GUI Tkinter简单实现个性签名设计
Jun 19 Python
python3使用print打印带颜色的字符串代码实例
Aug 22 Python
python图片验证码识别最新模块muggle_ocr的示例代码
Jul 03 Python
Keras中 ImageDataGenerator函数的参数用法
Jul 03 Python
Python编写memcached启动脚本代码实例
Aug 14 Python
浅谈anaconda python 版本对应关系
Oct 07 Python
Python基础之字符串格式化详解
Apr 21 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 和 COM
2006/10/09 PHP
php在线代理转向代码
2012/05/05 PHP
CI框架中site_url()和base_url()的区别
2015/01/07 PHP
浅谈PHP的$_SERVER[SERVER_NAME]
2017/02/04 PHP
基于jquery的跨域调用文件
2010/11/19 Javascript
JS动态添加option和删除option(附实例代码)
2013/04/01 Javascript
在js中判断checkboxlist(.net控件客户端id)是否有选中
2013/04/11 Javascript
jQuery$命名冲突怎么办如何解决
2014/01/16 Javascript
jquery单选框radio绑定click事件实现方法
2015/01/14 Javascript
浅谈jQuery构造函数分析
2015/05/11 Javascript
原生 JS Ajax,GET和POST 请求实例代码
2016/06/08 Javascript
AngularJS实现标签页的两种方式
2016/09/05 Javascript
jQuery实现带遮罩层效果的blockUI弹出层示例【附demo源码下载】
2016/09/14 Javascript
ajax图片上传,图片异步上传,更新实例
2016/12/30 Javascript
jquery实现图片上传前本地预览
2017/04/28 jQuery
元素全屏的设置与监听实例
2017/11/28 Javascript
浅谈Vue内置component组件的应用场景
2018/03/27 Javascript
Node.js原生api搭建web服务器的方法步骤
2019/02/15 Javascript
怎么使用javascript深度拷贝一个数组
2019/06/06 Javascript
Python中decorator使用实例
2015/04/14 Python
python中字符串数组逆序排列方法总结
2019/06/23 Python
Python实现使用dir获取类的方法列表
2019/12/24 Python
pytorch 图像预处理之减去均值,除以方差的实例
2020/01/02 Python
python argparse传入布尔参数false不生效的解决
2020/04/20 Python
MATCHESFASHION.COM美国官网:英国奢侈品零售商
2018/10/29 全球购物
计算机应用与科学个人的自我评价
2013/11/15 职场文书
学生请假条格式
2014/04/11 职场文书
《山谷中的谜底》教学反思
2014/04/26 职场文书
优秀工作者事迹材料
2014/12/26 职场文书
酒店工程部岗位职责
2015/02/12 职场文书
2015教师年度工作总结范文
2015/04/07 职场文书
2015年导购员工作总结
2015/04/25 职场文书
Python中zipfile压缩包模块的使用
2021/05/14 Python
opencv读取视频并保存图像的方法
2021/06/04 Python
分析Python感知线程状态的解决方案之Event与信号量
2021/06/16 Python
一条 SQL 语句执行过程
2022/03/17 MySQL