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中的MySQLdb模块添加超时功能的教程
May 05 Python
两个使用Python脚本操作文件的小示例分享
Aug 27 Python
浅谈python中的面向对象和类的基本语法
Jun 13 Python
Python3实现发送QQ邮件功能(文本)
Dec 15 Python
python获取酷狗音乐top500的下载地址 MP3格式
Apr 17 Python
tensorflow更改变量的值实例
Jul 30 Python
Python3.7实现中控考勤机自动连接
Aug 28 Python
Python创建一个空的dataframe,并循环赋值的方法
Nov 08 Python
python能否java成为主流语言吗
Jun 22 Python
零基础学Python之前需要学c语言吗
Jul 21 Python
实例代码讲解Python 线程池
Aug 24 Python
Python+Selenium随机生成手机验证码并检查页面上是否弹出重复手机号码提示框
Sep 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
简单介绍下 PHP5 中引入的 MYSQLI的用途
2007/03/19 PHP
使用Linux五年积累的一些经验技巧
2013/06/20 PHP
详谈php ip2long 出现负数的原因及解决方法
2017/04/05 PHP
php 人员权限管理(RBAC)实例(推荐)
2017/05/24 PHP
PHP设计模式之装饰器模式实例详解
2018/02/07 PHP
PHP实现的杨辉三角求解算法分析
2019/03/11 PHP
XP折叠菜单&仿QQ2006菜单
2006/12/16 Javascript
JQquery的一些使用心得分享
2012/08/01 Javascript
javascript时区函数介绍
2012/09/14 Javascript
JavaScript中合并数组的N种方法
2014/09/16 Javascript
js实现键盘Enter键提交表单的方法
2015/05/27 Javascript
javascript 继承学习心得总结
2016/03/17 Javascript
详谈vue+webpack解决css引用图片打包后找不到资源文件的问题
2018/03/06 Javascript
如何用RxJS实现Redux Form
2018/12/29 Javascript
解决vue+webpack项目接口跨域出现的问题
2020/08/10 Javascript
Javascript异步流程控制之串行执行详解
2020/09/27 Javascript
[02:44]重置世界,颠覆未来——DOTA2 7.23版本震撼上线
2019/12/01 DOTA
python 3.5下xadmin的使用及修复源码bug
2017/05/10 Python
flask使用session保存登录状态及拦截未登录请求代码
2018/01/19 Python
python按比例随机切分数据的实现
2019/07/11 Python
python实现屏保程序(适用于背单词)
2019/07/30 Python
python同步两个文件夹下的内容
2019/08/29 Python
python绘制无向图度分布曲线示例
2019/11/22 Python
Python 带星号(* 或 **)的函数参数详解
2021/02/23 Python
CSS3 box-sizing属性详解
2016/11/15 HTML / CSS
用CSS3实现瀑布流布局的示例代码
2017/11/10 HTML / CSS
曼城官方网上商店:Manchester City
2019/09/10 全球购物
采购助理岗位职责
2014/02/16 职场文书
团党委领导干部党的群众路线教育实践活动个人对照检查材料思想汇
2014/10/05 职场文书
学习党章的体会
2014/11/07 职场文书
房产公证书格式
2015/01/26 职场文书
2015年工程部工作总结
2015/04/30 职场文书
在职证明格式样本
2015/06/15 职场文书
MySQL Threads_running飙升与慢查询的相关问题解决
2021/05/08 MySQL
游戏《我的世界》澄清Xbox版暂无计划加入光追
2022/04/03 其他游戏
详解Redis的三种常用的缓存读写策略步骤
2022/05/06 Redis