【问题标题】:How can I Implement a SortedContainers.SortedListWithKey with multiple sort orders?如何实现具有多个排序顺序的 SortedContainers.SortedListWithKey?
【发布时间】:2017-10-30 21:24:10
【问题描述】:

由于“TypeError:一元操作数类型错误-:'str'”异常,下面的代码会失败,但它说明了我想要实现的目标。

from sortedcontainers import SortedListWithKey
contacts = SortedListWithKey(key=lambda val:(val.FirstName, -val.LastName))
class Person(object):
    pass

p1 = Person()
p1.FirstName = 'Amy'
p1.LastName = 'Obama'

p2 = Person()
p2.FirstName = 'Bob'
p2.LastName = 'Obama'

p3 = Person()
p3.FirstName = 'Bob'
p3.LastName = 'Trump'

p4 = Person()
p4.FirstName = 'Amy'
p4.LastName = 'Trump'

contacts.add(p1)
contacts.add(p2)
contacts.add(p3)
contacts.add(p4)

for p in contacts:
    print(p.FirstName, p.LastName)

预期的输出是:

Amy Trump
Amy Obama
Bob Trump
Bob Obama

如果 Person.LastName 是数字类型成员,上面的代码将起作用。

如果我没有实现一个 SortedList 而只是一个内置的未排序列表,我可以简单地做

contacts.sort(key = operator.itemgetter(0))
contacts.sort(key = operator.itemgetter(1), reverse=True)

但是对于我的情况,这个选项是不可能的。

SortedContainers 网站: http://www.grantjenks.com/docs/sortedcontainers/index.html

【问题讨论】:

  • SortedListWithKey 是否支持 reverse 参数?如果是,您可以通过 2 次排序调用来做到这一点。
  • @COLDSPEED:不幸的是它没有。而且它也不支持 Sort() 方法,因为它总是排序的。

标签: python python-3.x data-structures sortedlist sortedcontainers


【解决方案1】:

一种不优雅且不高效的方法是

contacts = SortedListWithKey(key=lambda val:(val.FirstName, [-ord(x) for x in val.LastName]))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 2013-02-18
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多