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中线程编程之threading模块的使用详解
Jun 23 Python
python中的字典使用分享
Jul 31 Python
详解python3实现的web端json通信协议
Dec 29 Python
Python基于tkinter模块实现的改名小工具示例
Jul 27 Python
Sublime开发python程序的示例代码
Jan 24 Python
python引用(import)某个模块提示没找到对应模块的解决方法
Jan 19 Python
python多进程读图提取特征存npy
May 21 Python
Python算法中的时间复杂度问题
Nov 19 Python
python next()和iter()函数原理解析
Feb 07 Python
Django 返回json数据的实现示例
Mar 05 Python
解决keras使用cov1D函数的输入问题
Jun 29 Python
python中查看.db文件中表格的名字及表格中的字段操作
Jul 07 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获取地址栏信息的代码
2008/10/08 PHP
php面向对象全攻略 (六)__set() __get() __isset() __unset()的用法
2009/09/30 PHP
浅析php中常量,变量的作用域和生存周期
2013/08/10 PHP
PHP中spl_autoload_register()和__autoload()区别分析
2014/05/10 PHP
CodeIgniter启用缓存和清除缓存的方法
2014/06/12 PHP
ThinkPHP的模版中调用session数据的方法
2014/07/01 PHP
PHP中递归的实现实例详解
2017/11/14 PHP
PHP中的empty、isset、isnull的区别与使用实例
2019/03/22 PHP
php实现获取近几日、月时间示例
2019/07/06 PHP
PHP的cookie与session原理及用法详解
2019/09/27 PHP
jQuery EasyUI中对表格进行编辑的实现代码
2010/06/10 Javascript
键盘上一张下一张兼容IE/google/firefox等浏览器
2014/01/28 Javascript
js实现鼠标悬停图片上时滚动文字说明的方法
2015/02/17 Javascript
浅谈javascript中的闭包
2015/05/13 Javascript
用瀑布流的方式在网页上插入图片的简单实现方法
2016/09/23 Javascript
JS实现css hover操作的方法示例
2017/04/07 Javascript
Bootstrap fileinput文件上传组件使用详解
2017/06/06 Javascript
解决vue.js在编写过程中出现空格不规范报错的问题
2017/09/20 Javascript
JS实现的base64加密解密操作示例
2018/04/18 Javascript
javascript json对象小技巧之键名作为变量用法分析
2019/11/11 Javascript
javascript 代码是如何被压缩的示例代码
2020/05/06 Javascript
[01:02:03]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS VG
2014/05/26 DOTA
[52:20]VP vs VG Supermajor小组赛 B组胜者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
Python3.5常见内置方法参数用法实例详解
2019/04/29 Python
python 同时读取多个文件的例子
2019/07/16 Python
美国最大的家庭鞋类零售商之一:Shoe Carnival
2017/10/06 全球购物
全球领先的全景影像品牌:Insta360
2019/08/21 全球购物
七年级政治教学反思
2014/02/03 职场文书
大学生在校学习的自我评价
2014/02/18 职场文书
教育英语专业毕业生的求职信
2014/03/13 职场文书
《独坐敬亭山》教学反思
2014/04/08 职场文书
分公司总经理岗位职责
2014/07/30 职场文书
2014四风问题对照检查材料范文
2014/09/15 职场文书
2015年度护士个人工作总结
2015/04/09 职场文书
2015年仓库管理工作总结
2015/05/25 职场文书
MySQL常用慢查询分析工具详解
2022/08/14 MySQL