Как я могу реализовать SortedContainers.SortedListWithKey с несколькими порядками сортировки?

Приведенный ниже код завершится ошибкой из-за исключения "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

1 ответ

Один не элегантный и не производительный способ сделать это

contacts = SortedListWithKey(key=lambda val:(val.FirstName, [-ord(x) for x in val.LastName]))
Другие вопросы по тегам