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简单检测文本类型的2种方法【基于文件头及cchardet库】
Sep 18 Python
Python针对给定列表中元素进行翻转操作的方法分析
Apr 27 Python
Python实现高斯函数的三维显示方法
Dec 29 Python
Python面向对象程序设计之私有属性及私有方法示例
Apr 08 Python
Python后台开发Django的教程详解(启动)
Apr 08 Python
详解python中的hashlib模块的使用
Apr 22 Python
Python进阶之使用selenium爬取淘宝商品信息功能示例
Sep 16 Python
python爬取王者荣耀全皮肤的简单实现代码
Jan 31 Python
python ffmpeg任意提取视频帧的方法
Feb 21 Python
Python接口测试文件上传实例解析
May 22 Python
python框架flask入门之环境搭建及开启调试
Jun 07 Python
如何通过python检查文件是否被占用
Dec 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数组排序usort、uksort与sort函数用法
2014/11/17 PHP
PHPCMS手机站伪静态设置详细教程
2017/02/06 PHP
php实现与python进行socket通信的方法示例
2017/08/30 PHP
php实现 master-worker 守护多进程模式的实例代码
2019/07/20 PHP
在网页中控制wmplayer播放器
2006/07/01 Javascript
Javascript 调试利器 Firebug使用详解六
2009/07/05 Javascript
基于jquery的可多选的下拉列表框
2012/07/20 Javascript
12款经典的白富美型—jquery图片轮播插件—前端开发必备
2013/01/08 Javascript
js函数模拟显示桌面.scf程序示例
2014/04/20 Javascript
jquery背景跟随鼠标滑动导航
2015/11/20 Javascript
第六篇Bootstrap表格样式介绍
2016/06/21 Javascript
Bootstrap实现带动画过渡的弹出框
2016/08/09 Javascript
详解vue嵌套路由-query传递参数
2017/05/23 Javascript
Django+Vue.js搭建前后端分离项目的示例
2017/08/07 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【圆形情况】
2018/12/13 Javascript
新年快乐! javascript实现超级炫酷的3D烟花特效
2019/01/30 Javascript
详解React项目如何修改打包地址(编译输出文件地址)
2019/03/21 Javascript
JavaScript实现多张图片放大镜效果示例【不限定图片尺寸,rem单位】
2019/05/14 Javascript
从零撸一个pc端vue的ui组件库( 计数器组件 )
2019/08/08 Javascript
three.js利用gpu选取物体并计算交点位置的方法示例
2019/11/25 Javascript
es6函数之严格模式用法实例分析
2020/03/17 Javascript
JavaScript实现答题评分功能页面
2020/06/24 Javascript
Python利用Beautiful Soup模块创建对象详解
2017/03/27 Python
python的exec、eval使用分析
2017/12/11 Python
opencv改变imshow窗口大小,窗口位置的方法
2018/04/02 Python
Python读写及备份oracle数据库操作示例
2018/05/17 Python
python实现微信每日一句自动发送给喜欢的人
2019/04/29 Python
使用Python paramiko模块利用多线程实现ssh并发执行操作
2019/12/05 Python
Kangol帽子官网:坎戈尔袋鼠
2018/09/26 全球购物
乐高西班牙官方商店:LEGO Shop ES
2019/12/01 全球购物
3的组成教学反思
2014/04/30 职场文书
2014年基层党建工作总结
2014/11/11 职场文书
2015年中学团委工作总结
2015/07/22 职场文书
微信早安问候语
2015/11/10 职场文书
乔迁新居祝福语
2019/11/04 职场文书
浅谈JavaScript浅拷贝和深拷贝
2021/11/07 Javascript