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 相关文章推荐
在Django的模型中添加自定义方法的示例
Jul 21 Python
python爬虫_微信公众号推送信息爬取的实例
Oct 23 Python
python中将\\uxxxx转换为Unicode字符串的方法
Sep 06 Python
python通过配置文件共享全局变量的实例
Jan 11 Python
浅析Python与Mongodb数据库之间的操作方法
Jul 01 Python
python实现一行输入多个值和一行输出多个值的例子
Jul 16 Python
python 修改本地网络配置的方法
Aug 14 Python
python修改linux中文件(文件夹)的权限属性操作
Mar 05 Python
python 使用cx-freeze打包程序的实现
Mar 14 Python
django实现HttpResponse返回json数据为中文
Mar 27 Python
python 已知三条边求三角形的角度案例
Apr 12 Python
python处理json数据文件
Apr 11 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 STRING 陷阱原理说明
2010/07/24 PHP
JS OOP包机制,类创建的方法定义
2009/11/02 Javascript
javascript 函数速查表
2010/02/07 Javascript
js 省地市级联选择
2010/02/07 Javascript
JavaScript(JS) 压缩 / 混淆 / 格式化 批处理工具
2010/12/10 Javascript
jQuery中对节点进行操作的相关介绍
2013/04/16 Javascript
浅谈被jQuery抛弃的函数及替代函数
2015/05/03 Javascript
jQuery div拖拽用法实例
2016/01/14 Javascript
Bootstrap3制作自己的导航栏
2016/05/12 Javascript
通过修改360抢票的刷新频率和突破8车次限制实现方法
2017/01/04 Javascript
bootstrap——bootstrapTable实现隐藏列的示例
2017/01/14 Javascript
Web开发中客户端的跳转与服务器端的跳转的区别
2017/03/05 Javascript
关于js中的鼠标事件总结
2017/07/11 Javascript
使用ionic(选项卡栏tab) icon(图标) ionic上拉菜单(ActionSheet) 实现通讯录界面切换实例代码
2017/10/20 Javascript
AngularJS实现自定义指令及指令配置项的方法
2017/11/20 Javascript
mui back 返回刷新页面的实例
2017/12/06 Javascript
如何开发出更好的JavaScript模块
2017/12/22 Javascript
详释JavaScript执行环境与执行栈
2019/04/02 Javascript
vue实现输入一位数字转汉字功能
2019/12/13 Javascript
leaflet加载geojson叠加显示功能代码
2020/02/21 Javascript
vue 解决uglifyjs-webpack-plugin打包出现报错的问题
2020/08/04 Javascript
Python获取当前路径实现代码
2017/05/08 Python
python实现用户答题功能
2018/01/17 Python
Python实现爬虫设置代理IP和伪装成浏览器的方法分享
2018/05/07 Python
浅析pandas 数据结构中的DataFrame
2019/10/12 Python
Matplotlib使用字符串代替变量绘制散点图的方法
2020/02/17 Python
利用HTML5中的Canvas绘制一张笑脸的教程
2015/05/07 HTML / CSS
英国门销售网站:Green Tree Doors
2020/01/07 全球购物
员工工作表扬信范文
2014/01/13 职场文书
六五普法规划实施方案
2014/03/21 职场文书
珍惜资源保护环境的建议书
2014/05/14 职场文书
六一儿童节活动总结
2014/08/27 职场文书
群众路线个人自我剖析材料
2014/10/07 职场文书
2016年高校自主招生自荐信范文
2015/03/24 职场文书
应收账款管理制度
2015/08/06 职场文书
大学生饮品店创业计划书范文
2019/07/10 职场文书