Python:使用多个属性和混合顺序进行列表排序

Ber*_*ant 19 python sorting list

我必须对具有多个属性的python列表进行排序.我可以轻松地按升序排列所有属性

L.sort(key=operator.attrgetter(attribute))....
Run Code Online (Sandbox Code Playgroud)

但问题是,我已经使用混合配置进行升序/降序......我必须"模仿"一些SQL命令,你可以在那里做一些像"命名ASC,年DESC"的事情.有没有办法在python中轻松实现这一点,而无需实现自定义比较功能?

S.L*_*ott 29

如果您的属性是数字,则可以使用此属性.

def mixed_order( a ):
    return ( a.attribute1, -a.attribute2 )

someList.sort( key=mixed_order )
Run Code Online (Sandbox Code Playgroud)

如果您的属性包含字符串或其他更复杂的对象,则您有一些选择.

.sort()方法是稳定的:你可以做多遍.这可能是最简单的.它也非常快.

def key1( a ): return a.attribute1
def key2( a ): return a.attribute2

someList.sort( key=key2, reverse=True )
someList.sort( key=key1 )
Run Code Online (Sandbox Code Playgroud)

如果这是唯一的排序,您可以定义自己的专用比较运算符.最低限度,你需要__eq____lt__.其他四个可以通过简单的逻辑从这两个中导出.


Red*_*yph 7

自定义函数将使您的代码更具可读性.如果你有很多排序操作,但你不想创建这些函数,你可以使用lambda:

L.sort(lambda x, y: cmp(x.name, y.name) or -cmp(x.year, y.year))
Run Code Online (Sandbox Code Playgroud)


Luk*_*ský 6

你不能,但写比较功能很容易:

def my_cmp(a, b):
    return cmp(a.foo, b.foo) or cmp(b.bar, a.bar)
L.sort(my_cmp)
Run Code Online (Sandbox Code Playgroud)