【问题标题】:List sorting with multiple attributes and mixed order具有多个属性和混合顺序的列表排序
【发布时间】:2010-12-03 17:27:58
【问题描述】:

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

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

但问题是,我必须使用混合配置进行升序/降序...我必须“模仿”一点 SQL Order By,您可以在其中执行 name ASC, year DESC 之类的操作。 有没有办法在 Python 中轻松做到这一点,而无需实现自定义比较函数?

【问题讨论】:

标签: python list sorting


【解决方案1】:

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

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__。其他四个可以通过简单的逻辑从这两个推导出来。

【讨论】:

  • 谢谢! callint sort() 多次被证明是我的完美解决方案!
  • 感谢您的回答!关于第一部分有点混乱;返回元组是否执行复杂排序,索引值越高优先级越低?我想我的问题更笼统,cmp 在处理两个元组时表现如何?我环顾四周,找不到这个记录。
  • eq 可以使用简单的逻辑从 lt 推导出来。 :)
  • 指出使用这种方法您必须颠倒排序顺序(正如您所做的那样)可能会有所帮助。
【解决方案2】:

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

L.sort(lambda x, y: cmp(x.name, y.name) or -cmp(x.year, y.year))

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多