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开发编码规范
Sep 08 Python
Python open读写文件实现脚本
Sep 06 Python
对Python中type打开文件的方式介绍
Apr 28 Python
Python实现矩阵相乘的三种方法小结
Jul 26 Python
python判断字符串或者集合是否为空的实例
Jan 23 Python
python pexpect ssh 远程登录服务器的方法
Feb 14 Python
Python3安装psycopy2以及遇到问题解决方法
Jul 03 Python
使用apiDoc实现python接口文档编写
Nov 19 Python
Pytorch .pth权重文件的使用解析
Feb 14 Python
python 穷举指定长度的密码例子
Apr 02 Python
pyCharm 实现关闭代码检查
Jun 09 Python
解决python3中os.popen()出错的问题
Nov 19 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
9个PHP开发常用功能函数小结
2011/07/15 PHP
Laravel5.1 框架Request请求操作常见用法实例分析
2020/01/04 PHP
MooTools 1.2中的Drag.Move来实现拖放
2009/09/15 Javascript
Javascript模块化编程详解
2014/12/01 Javascript
jquery制作漂亮的弹出层提示消息特效
2014/12/23 Javascript
删除javascript所创建子节点的方法
2015/05/21 Javascript
深入浅出ES6之let和const命令
2016/08/25 Javascript
jquery中$.fn和图片滚动效果实现的必备知识总结
2017/04/21 jQuery
详解AngularJs路由之Ui-router-resolve(预加载)
2017/06/13 Javascript
jquery.uploadView 实现图片预览上传功能
2017/08/10 jQuery
JS排序算法之希尔排序与快速排序实现方法
2017/12/12 Javascript
新手入门带你学习JavaScript引擎运行原理
2019/06/24 Javascript
JS脚本实现定时到网站上签到/签退功能
2020/04/22 Javascript
python中的多重继承实例讲解
2014/09/28 Python
利用Python中的输入和输出功能进行读取和写入的教程
2015/04/14 Python
连接Python程序与MySQL的教程
2015/04/29 Python
python3读取excel文件只提取某些行某些列的值方法
2018/07/10 Python
Python通过paramiko远程下载Linux服务器上的文件实例
2018/12/27 Python
Python 3.8正式发布,来尝鲜这些新特性吧
2019/10/15 Python
基于Python实现签到脚本过程解析
2019/10/25 Python
使用Python测试Ping主机IP和某端口是否开放的实例
2019/12/17 Python
python给图像加上mask,并提取mask区域实例
2020/01/19 Python
python和pywin32实现窗口查找、遍历和点击的示例代码
2020/04/01 Python
Django调用百度AI接口实现人脸注册登录代码实例
2020/04/23 Python
Python生成器next方法和send方法区别详解
2020/05/30 Python
Python JSON常用编解码方法代码实例
2020/09/05 Python
python基于openpyxl生成excel文件
2020/12/23 Python
CSS3下的渐变文字效果实现示例
2018/03/02 HTML / CSS
咖啡厅商业计划书
2014/09/15 职场文书
检察院对照“四风”认真查找问题落实整改措施
2014/09/26 职场文书
大学生自荐信怎么写
2015/03/26 职场文书
读《皮囊》有感:理解是对他人的最大的善举
2019/11/14 职场文书
浅谈Python数学建模之整数规划
2021/06/23 Python
手残删除python之后的补救方法
2021/06/26 Python
一文了解JavaScript用Element Traversal新属性遍历子元素
2021/11/27 Javascript
Win Server2016远程桌面如何允许多用户同时登录
2022/06/10 Servers