2015-04-23 14 views
11

ich eine verschachtelte Liste haben, die verschiedene Objekte enthält, sie doppelte Paare von Objekten in der verschachtelten Liste sind und ich versuche, sie zu entfernen, aber ich halte einewie Sortieren Python Objekte

TypeError: unorderable types: practice() < practice()

bekommen

ich weiß, dass dieser Fehler verursacht wird, von mir versucht, mit Objekten zu arbeiten, anstatt ganze Zahlen, aber ich weiß nicht, wie sonst die Duplikate hier zu entfernen ist, was habe ich versucht

class practice: 
    id = None 

    def __init__(self,id): 
     self.id = id 

a = practice('a') 
b = practice('b') 
c = practice('c') 
d = practice('d') 
e = practice('e') 
f = practice('f') 

x = [[a,b],[c,d],[a,b],[e,f],[a,b]] 

unique_list = list() 
for item in x: 
    if sorted(item) not in unique_list: 
     unique_list.append(sorted(item)) 

print(unique_list) 
+2

Pass in einem Komparator 'key' zu' sorted' sollte funktionieren. – Luca

Antwort

6

Wenn Sie die Objekte durch die vergleichen wollen ID:

class practice: 
    id = None 

    def __init__(self,id): 
     self.id = id 

    def __lt__(self, other): 
     return other.id > self.id 

    def __gt__(self, other): 
     return self.id > other.id 

unique_list = list() 
for item in x: 
    if sorted(item) not in unique_list: 
     unique_list.append(sorted(item)) 

print(unique_list) 
[[<__main__.practice object at 0x7fe87e717c88>, <__main__.practice object at 0x7fe87e717cc0>], 
[<__main__.practice object at 0x7fe86f5f79e8>, <__main__.practice object at 0x7fe86f589278>], 
[<__main__.practice object at 0x7fe86f589be0>, <__main__.practice object at 0x7fe86f589c18>]] 

Abhängig von der Funktionalität wollen Sie alle implementieren die rich comparison ordering methods Sie functools.total_ordering verwenden können, müssen Sie nur eine der Methoden definieren, und es wird

from functools import total_ordering 
@total_ordering 
class practice: 
    id = None 

    def __init__(self,id): 
     self.id = id 

    def __lt__(self, other): 
     return other.id > self.id 

    def __eq__(self, other): 
     return self.id == other.id 
der Rest kümmern

Bei einer Klasse, die eine oder mehrere Rich-Ordering-Methoden definiert, liefert dieser Klassen-Decorator den Rest. Dies vereinfacht den Aufwand in alle möglichen reichen Vergleichsoperationen spezifizieren:

Die Klasse eines __lt__() definieren müssen, __le__(), __gt__() oder __ge__(). Zusätzlich sollte die Klasse eine __eq__() Methode bereitstellen.

+0

Die erste Option funktionierte für mich ... Danke – danidee

+0

Nein, ich habe nur das zweite Beispiel hinzugefügt, wie es helfen kann, wenn Sie später mehr Funktionalität hinzufügen möchten –

3

Sortierung ohne explizite Schlüssel für Objekte in Python unterstützen 3, müssen Sie die __lt__ spezielle Methode implementieren:

class practice: 
    id = None 

    def __init__(self,id): 
     self.id = id 

    def __lt__(self, other): 
     return self.id < other.id 

Wenn Sie die anderen Betreiber arbeiten wollen, müssen Sie ihre besondere umsetzen müssen Methoden, aber zum Sortieren __lt__ ist alles was Sie brauchen.

Wie in den Kommentaren erwähnt, ist die andere Möglichkeit, es zu tun, ist eine explizite Schlüsselfunktion zu dem Built-in sorted zu bieten:

sorted(item, key=lambda x: x.id) 
+0

versuchte, die Lambda-Methode zu verwenden, erstellte ich eine neue Variable und setzte es gleich zu sortieren (item, key = lambda x: x.id), aber wenn ich versuche, den Wert auszudrucken, bekomme ich Praxisobjekt nicht iterierbar. soll es nicht eine Liste sein? – danidee

+0

@danidee Das erste Argument für die Sortierung muss ein iterabler Wert für Übungsobjekte sein. Probieren Sie also zum Beispiel 'sorted ([üben ('b'), üben ('a')], key = lambda x: x.id)'. Es wird eine neue Liste in der Form zurückgeben: '[Übung ('a'), Übung ('b')]' – Shashank

Verwandte Themen