0

以下のコードは、 "TypeError:unary - : 'str'例外のオペランドタイプが不良ですが、達成しようとしていることを示しています。SortedContainers.SortedListWithKeyを複数のソート順で実装する方法はありますか

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

+0

ある '' reverse'引数をサポートしてSortedListWithKey'していますか?はいの場合は、2回の並べ替え呼び出しでこれを行うことができます。 –

+0

@COLDSPEED:残念ながら、それはしません。 Sort()メソッドは常にソートされているため、ソートもサポートされていません。 – Jimbo

答えて

0

一つエレガントではないとパフォーマンスではない方法は

contacts = SortedListWithKey(key=lambda val:(val.FirstName, [-ord(x) for x in val.LastName])) 
関連する問題