前言
最近在工作中碰到一个小的排序问题,需要按嵌套对象的多个属性来排序,于是发现了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