前言
最近在工作中碰到一个小的排序问题,需要按嵌套对象的多个属性来排序,于是发现了Python里的operator模块和sorted函数组合可以实现这个功能。本文介绍了Python用operator模块实现对象的多级排序的相关内容,分享出来供大家参考学习,下面来看看详细的介绍:
比如我有如下的类关系,A对象引用了一个B对象,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
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属性来排序。
1
2
3
4
5
6
7
8
9
|
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
|
[[u1, AAA, 100 ], [u3, BBB, 10 ], [u2, BBB, 100 ]] [[u2, BBB, 100 ], [u3, BBB, 10 ], [u1, AAA, 100 ]] |
那么,如果我需要先按b.attr2正序,再按b.attr3倒序来排序,可以使用下面组合来实现:
1
2
3
|
s = sorted (aaa, key = attrgetter( 'b.attr3' ), reverse = True ) s = sorted (s, key = attrgetter( 'b.attr2' )) print s |
运行结果如下:
1
|
[[u1, AAA, 100 ], [u2, BBB, 100 ], [u3, BBB, 10 ]] |
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。
原文链接:http://blog.csdn.net/kongxx/article/details/71122953