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模块restful使用方法实例
Dec 10 Python
详解Python中find()方法的使用
May 18 Python
python 用lambda函数替换for循环的方法
Jun 09 Python
python实现简易动态时钟
Nov 19 Python
使用Python自动化破解自定义字体混淆信息的方法实例
Feb 13 Python
python的一些加密方法及python 加密模块
Jul 11 Python
python几种常用功能实现代码实例
Dec 25 Python
解决Python import docx出错DLL load failed的问题
Feb 13 Python
解决pyPdf和pyPdf2在合并pdf时出现异常的问题
Apr 03 Python
Python logging日志库空间不足问题解决
Sep 14 Python
教你如何使用Python下载B站视频的详细教程
Apr 29 Python
仅用几行Python代码就能复制她的U盘文件?
Jun 26 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函数mkdir实现递归创建层级目录
2016/10/27 PHP
PHP中Trait及其应用详解
2017/02/14 PHP
php动态读取数据清除最右边距的方法
2017/04/12 PHP
TP3.2批量上传文件或图片 同名冲突问题的解决方法
2017/08/01 PHP
Sample script that deletes a SQL Server database
2007/06/16 Javascript
Ext.FormPanel 提交和 Ext.Ajax.request 异步提交函数的区别
2009/11/12 Javascript
JavaScript是否可实现多线程  深入理解JavaScript定时机制
2009/12/22 Javascript
JavaScript操作XML实例代码(获取新闻标题并分页,并分页)
2010/05/25 Javascript
javascript打印大全(打印页面设置/打印预览代码)
2013/03/29 Javascript
javascript中onclick(this)用法介绍
2013/04/19 Javascript
jquery插件之定时查询待处理任务数量
2014/05/01 Javascript
bootstrap输入框组代码分享
2016/06/07 Javascript
jquery删除数组中重复元素
2016/12/05 Javascript
Vue中封装input组件的实例详解
2017/10/17 Javascript
手机注册发送验证码倒计时的简单实例
2017/11/15 Javascript
JS实现的简单分页功能示例
2018/08/23 Javascript
vue 实现搜索的结果页面支持全选与取消全选功能
2019/05/10 Javascript
js实现超级玛丽小游戏
2020/03/18 Javascript
Javascript实现秒表计时游戏
2020/05/27 Javascript
[01:45]亚洲邀请赛互动指南虚拟物品介绍
2015/01/30 DOTA
简单介绍使用Python解析并修改XML文档的方法
2015/10/15 Python
python实现将内容分行输出
2015/11/05 Python
浅谈Python里面小数点精度的控制
2018/07/16 Python
python中scikit-learn机器代码实例
2018/08/05 Python
关于Python 的简单栅格图像边界提取方法
2019/07/05 Python
深入浅析Python 中的sklearn模型选择
2019/10/12 Python
Pygame的程序开始示例代码
2020/05/07 Python
python中用ggplot绘制画图实例讲解
2021/01/26 Python
canvas学习总结三之绘制路径-线段
2019/01/31 HTML / CSS
美国百年历史早餐食品供应商:Wolferman’s
2017/01/18 全球购物
学生处主任岗位职责
2013/12/01 职场文书
DIY手工制作经营店创业计划书
2014/02/01 职场文书
2015年卫生监督工作总结
2015/05/21 职场文书
幼儿园教师管理制度
2015/08/05 职场文书
vue项目多环境配置(.env)的实现
2021/07/21 Vue.js
CSS实现渐变色边框(Gradient borders)的5种方法
2022/03/25 HTML / CSS