代码之家  ›  专栏  ›  技术社区  ›  Bernhard Vallant

python:具有多个属性和混合顺序的列表排序

  •  17
  • Bernhard Vallant  · 技术社区  · 15 年前

    我必须对具有多个属性的python列表进行排序。我可以按照升序对所有属性轻松地执行该操作

    L.sort(key=operator.attrgetter(attribute))....
    

    但问题是,我对升序/降序使用了混合配置…我必须“模仿”一点SQL顺序,在这里您可以做一些类似“name asc,year desc”的事情。 有没有一种方法可以在Python中轻松地做到这一点,而不必实现自定义的比较函数?

    3 回复  |  直到 11 年前
        1
  •  27
  •   S.Lott    15 年前

    如果你的属性是数字,你就有了这个。

    def mixed_order( a ):
        return ( a.attribute1, -a.attribute2 )
    
    someList.sort( key=mixed_order )
    

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

    这个 .sort() 方法是稳定的:你可以多次通过。这也许是最简单的。速度也非常快。

    def key1( a ): return a.attribute1
    def key2( a ): return a.attribute2
    
    someList.sort( key=key2, reverse=True )
    someList.sort( key=key1 )
    

    如果这是唯一的排序方式,则可以定义自己的专用比较运算符。至少,你需要 __eq__ __lt__ . 其他四个可以通过简单的逻辑从这两个派生出来。

        2
  •  7
  •   RedGlyph sumit sonawane    15 年前

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

    L.sort(lambda x, y: cmp(x.name, y.name) or -cmp(x.year, y.year))
    
        3
  •  6
  •   LukáÅ¡ Lalinský    15 年前

    不能,但编写比较函数很容易:

    def my_cmp(a, b):
        return cmp(a.foo, b.foo) or cmp(b.bar, a.bar)
    L.sort(my_cmp)