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自动连接ssh的方法
Mar 07 Python
python 实现tar文件压缩解压的实例详解
Aug 20 Python
基于python OpenCV实现动态人脸检测
May 25 Python
Python设计模式之代理模式实例详解
Jan 19 Python
Python 实现域名解析为ip的方法
Feb 14 Python
python中import与from方法总结(推荐)
Mar 21 Python
python flask框架实现重定向功能示例
Jul 02 Python
Python自动化导出zabbix数据并发邮件脚本
Aug 16 Python
对Matlab中共轭、转置和共轭装置的区别说明
May 11 Python
python os模块在系统管理中的应用
Jun 22 Python
python 爬取B站原视频的实例代码
Sep 09 Python
python中使用.py配置文件的方法详解
Nov 23 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 ajax 静态分页过程形式
2011/09/02 PHP
php获取ip的三个属性区别介绍(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)
2012/09/23 PHP
PHP编码转换
2012/11/05 PHP
基于empty函数的输出详解
2013/06/17 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
js日历功能对象
2012/01/12 Javascript
JS随即打乱数组实现代码
2012/12/03 Javascript
利用js的Node遍历找到repeater的一个字段实例介绍
2013/04/25 Javascript
js 走马灯简单实例
2013/11/21 Javascript
Javascript仿PHP $_GET获取URL中的参数
2014/05/12 Javascript
浅谈JSON和JSONP区别及jQuery的ajax jsonp的使用
2014/11/23 Javascript
jQuery+easyui中的combobox实现下拉框特效
2015/02/27 Javascript
jQuery中inArray方法注意事项分析
2016/01/25 Javascript
基于javascript实现句子翻牌网页版小游戏
2016/03/23 Javascript
概述jQuery中的ajax方法
2016/12/16 Javascript
Bootstrap 填充Json数据的实例代码
2017/01/11 Javascript
微信小程序 获取二维码实例详解
2017/06/23 Javascript
浅谈ECMAScript6新特性之let、const
2017/08/02 Javascript
vue2利用Bus.js如何实现非父子组件通信详解
2017/08/25 Javascript
修改node.js默认的npm安装目录实例
2018/05/15 Javascript
深入理解JavaScript的async/await
2018/08/05 Javascript
探索浏览器页面关闭window.close()的使用详解
2020/08/21 Javascript
[02:56]DOTA2英雄基础教程 巨魔战将
2013/12/10 DOTA
Python实现UDP程序通信过程图解
2020/05/15 Python
python代码实现将列表中重复元素之间的内容全部滤除
2020/05/22 Python
美国著名的女性内衣零售商:Frederick’s of Hollywood
2018/02/24 全球购物
爱奇艺VIP会员:大剧抢先看
2018/07/11 全球购物
美国社交购物市场:MassGenie
2019/02/18 全球购物
学生处主任岗位职责
2013/12/01 职场文书
资源工程专业毕业生求职信
2014/02/27 职场文书
教师自我剖析材料
2014/09/29 职场文书
2014年质量工作总结
2014/11/22 职场文书
道士塔读书笔记
2015/06/30 职场文书
Python中X[:,0]和X[:,1]的用法
2021/05/10 Python
为什么MySQL选择Repeatable Read作为默认隔离级别
2021/07/26 MySQL
Windows Server 2012配置DNS服务器的方法
2022/04/29 Servers