Python中使用operator模块实现对象的多级排序

今天碰到一个小的排序问题,需要按嵌套对象的多个属性来排序,于是发现了Python里的operator模块和sorted函数组合可以实现这个功能。

比如我有如下的类关系,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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

下面是测试排序代码,这里是按照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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

运行上面的测试,结果如下:

[[u1, AAA, 100], [u3, BBB, 10], [u2, BBB, 100]]
[[u2, BBB, 100], [u3, BBB, 10], [u1, AAA, 100]]
  • 1
  • 2
 
  • 1
  • 2

那么,如果我需要先按b.attr2正序,再按b.attr3倒序来排序,可以使用下面组合来实现:

s = sorted(aaa, key=attrgetter('b.attr3'), reverse=True)
s = sorted(s, key=attrgetter('b.attr2'))
print s
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

运行结果如下:

[[u1, AAA, 100], [u2, BBB, 100], [u3, BBB, 10]]

http://mobike.365soke.cn/
http://youbai.365soke.cn/
http://qibeitech.365soke.cn/

最新文章

  1. CocoaPods使用 主要带图。转载。
  2. 记一次故障处理----主机异常关闭后mongodb二进制文件损坏
  3. docker基础命令
  4. nginx 缓存机制
  5. 关于sources.list和apt-get [转载]
  6. Ehcache(2.9.x) - API Developer Guide, Class Loading
  7. TDBAdvGrid 只读状态下复制功能
  8. Q_INIT_RESOURCE宏
  9. 20个高级Java面试题
  10. 制作可独立分发的Android模拟器
  11. Repeater隔行变色,两个方式
  12. objective-c 可变参数
  13. hdu4704之费马小定理+整数快速幂
  14. jQuery表单对象属性过滤选择器
  15. Springboot security cas整合方案-实践篇
  16. Javscript的函数链式调用基础篇
  17. JAVA图片验证码(转自“云在青山”)
  18. bootStrap的使用
  19. EL表达式和标签
  20. 《C++ Primer Plus》第10章 对象和类 学习笔记

热门文章

  1. NET操作RabbitMQ组件EasyNetQ
  2. static特别用法【静态导包】——Java包的静态导入
  3. CRM系统设计方案
  4. js判断手机机型,然后进行相对应的操作
  5. oracle查看表结构命令desc
  6. vue-resources&axios
  7. C# Note1:深入浅出WPF-MVVM篇
  8. wireshark抓包获取好友ip,定位所在位置
  9. windows 10 & task view & shortcut
  10. MySQL中and和or的优先级的问题