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__.其他四个可以通过简单的逻辑从这两个中导出.
自定义函数将使您的代码更具可读性.如果你有很多排序操作,但你不想创建这些函数,你可以使用lambda:
L.sort(lambda x, y: cmp(x.name, y.name) or -cmp(x.year, y.year))
Run Code Online (Sandbox Code Playgroud)
你不能,但写比较功能很容易:
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)