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 相关文章推荐
sublime text 3配置使用python操作方法
Jun 11 Python
详解python函数传参是传值还是传引用
Jan 16 Python
python字符串string的内置方法实例详解
May 14 Python
对python同一个文件夹里面不同.py文件的交叉引用方法详解
Dec 15 Python
python日期相关操作实例小结
Jun 24 Python
详解python调用cmd命令三种方法
Jul 08 Python
Python基于类路径字符串获取静态属性
Mar 12 Python
python用什么编辑器进行项目开发
Jun 17 Python
PyQt5通过信号实现MVC的示例
Feb 06 Python
Python 求向量的余弦值操作
Mar 04 Python
Python字符串对齐方法使用(ljust()、rjust()和center())
Apr 26 Python
Python打包exe时各种异常处理方案总结
May 18 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的加密方式及原理
2012/06/14 PHP
MacOS 安装 PHP的图片裁剪扩展Tclip
2015/03/25 PHP
求解开jscript.encode代码的asp函数
2007/02/28 Javascript
jQuery学习笔记之DOM对象和jQuery对象
2010/12/22 Javascript
在VS2008中使用jQuery智能感应的方法
2010/12/30 Javascript
JS将秒换成时分秒实现代码
2013/09/03 Javascript
JS与C#编码解码
2013/12/03 Javascript
JavaScript实现选择框按比例拖拉缩放的方法
2015/08/04 Javascript
jquery ajax结合thinkphp的getjson实现跨域的方法
2016/06/06 Javascript
客户端验证用户名和密码的方法详解
2016/06/16 Javascript
JS实现表单多文件上传样式美化支持选中文件后删除相关项
2016/09/30 Javascript
第一次接触Bootstrap框架
2016/10/24 Javascript
Angular的MVC和作用域
2016/12/26 Javascript
利用Node.js对文件进行重命名
2017/03/12 Javascript
用JavaScript和jQuery实现瀑布流
2017/03/19 Javascript
Vue.js鼠标悬浮更换图片功能
2017/05/17 Javascript
JavaScript onclick事件使用方法详解
2020/05/15 Javascript
vue设置全局访问接口API地址操作
2020/08/14 Javascript
JS访问对象两种方式区别解析
2020/08/29 Javascript
Vue中ref和$refs的介绍以及使用方法示例
2021/01/11 Vue.js
爬山算法简介和Python实现实例
2014/04/26 Python
django实现分页的方法
2015/05/26 Python
Python实现快速傅里叶变换的方法(FFT)
2018/07/21 Python
使用Python Pandas处理亿级数据的方法
2019/06/24 Python
Python selenium 加载并保存QQ群成员,去除其群主、管理员信息的示例代码
2020/05/28 Python
大学生旷课检讨书
2014/01/22 职场文书
酒店管理求职信
2014/06/09 职场文书
电子商务求职信
2014/06/15 职场文书
信访维稳工作汇报
2014/10/27 职场文书
2014年节能减排工作总结
2014/12/06 职场文书
先进员工事迹材料
2014/12/20 职场文书
天下第一关导游词
2015/02/06 职场文书
肖申克的救赎观后感
2015/06/02 职场文书
2016年元旦寄语
2015/08/17 职场文书
Python序列化模块JSON与Pickle
2022/06/05 Python
mysql数据库实现设置字段长度
2022/06/10 MySQL