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使用urlparse分析网址中域名的方法
Apr 15 Python
Python入门之三角函数sin()函数实例详解
Nov 08 Python
Win7下Python与Tensorflow-CPU版开发环境的安装与配置过程
Jan 04 Python
python3.6.3+opencv3.3.0实现动态人脸捕获
May 25 Python
python 保存float类型的小数的位数方法
Oct 17 Python
python实现创建新列表和新字典,并使元素及键值对全部变成小写
Jan 15 Python
对Python中TKinter模块中的Label组件实例详解
Jun 14 Python
在python 中split()使用多符号分割的例子
Jul 15 Python
django创建超级用户时指定添加其它字段方式
May 14 Python
python查看矩阵的行列号以及维数方式
May 22 Python
如何在mac版pycharm选择python版本
Jul 21 Python
Python中常用的os操作汇总
Nov 05 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实现维护文件代码
2007/06/14 PHP
浅谈PHP中单引号和双引号到底有啥区别呢?
2015/03/04 PHP
php使用timthumb生成缩略图的方法
2016/01/22 PHP
PHP简单获取多个checkbox值的方法
2016/06/13 PHP
如何离线执行php任务
2017/02/21 PHP
使用CSS3实现字体颜色渐变的实现
2021/03/09 HTML / CSS
Javascript 兼容firefox的一些问题
2009/05/21 Javascript
js 对象是否存在判断
2009/07/15 Javascript
JavaScript 面向对象的之私有成员和公开成员
2010/05/04 Javascript
JavaScript子类用Object.getPrototypeOf去调用父类方法解析
2013/12/05 Javascript
jQuery实现的Div窗口震动特效
2014/06/09 Javascript
滚动条响应鼠标滑轮事件实现上下滚动的js代码
2014/06/30 Javascript
javascript中HTMLDOM操作详解
2014/12/11 Javascript
深入理解javascript中concat方法
2016/12/12 Javascript
Bootstrap的modal拖动效果
2016/12/25 Javascript
Mint-UI时间组件起始时间问题及时间插件使用
2018/08/20 Javascript
Vue2.0学习系列之项目上线的方法步骤(图文)
2018/09/25 Javascript
vue动画效果实现方法示例
2019/03/18 Javascript
微信小程序实现获取小程序码和二维码java接口开发
2019/03/29 Javascript
js 判断当前时间是否处于某个一个时间段内
2019/09/19 Javascript
python实现发送邮件功能代码
2017/12/14 Python
Python中的defaultdict与__missing__()使用介绍
2018/02/03 Python
python 读取文件并替换字段的实例
2018/07/12 Python
Face++ API实现手势识别系统设计
2018/11/21 Python
python 用opencv调用训练好的模型进行识别的方法
2018/12/07 Python
Python3爬虫学习之MySQL数据库存储爬取的信息详解
2018/12/12 Python
Python imread、newaxis用法详解
2019/11/04 Python
Pytorch 搭建分类回归神经网络并用GPU进行加速的例子
2020/01/09 Python
浅析pip安装第三方库及pycharm中导入第三方库的问题
2020/03/10 Python
大学校庆策划书
2014/01/31 职场文书
房屋租赁协议书范本
2014/04/10 职场文书
小学学校门卫岗位职责
2014/08/03 职场文书
生日答谢词
2015/01/05 职场文书
2015年南京大屠杀纪念日活动总结
2015/03/24 职场文书
2015年公路养护工作总结
2015/05/13 职场文书
党员证明模板
2015/06/19 职场文书