Gibt es eine Möglichkeit, ein Python-Objekt zu erstellen, das nicht sortierbar ist?

8

Gibt es eine Möglichkeit, ein Python-Objekt zu erstellen, das nicht sortierbar ist? Also wird das eine Ausnahme sein, wenn man versucht, eine Liste dieser Objekte zu sortieren? Ich habe eine sehr einfache Klasse erstellt, keine Vergleichsmethoden definiert, aber Instanzen dieser Klasse sind vergleichbar und damit sortierbar. Vielleicht erbt meine Klasse Vergleichsmethoden von irgendwo. Aber ich will dieses Verhalten nicht.

    
Graf 02.03.2010, 21:55
quelle

7 Antworten

7

Sie könnten eine __cmp__ -Methode für die Klasse definieren und beim Aufruf immer eine Ausnahme auslösen. Das könnte den Trick machen.

Aus Neugier, warum?

    
Will McCutchen 02.03.2010 21:58
quelle
1

Wie Will McCutchen erwähnt hat, können Sie eine __cmp__ -Methode definieren, die eine Ausnahme auslöst, um die Sortierung von Gartensorten zu verhindern. Etwas wie das:

%Vor%

Sie können jedoch nicht wirklich verhindern, dass ein Entwickler eine Liste Ihrer Objekte sortiert. Mit dem Argument key oder cmp mit list.sort() oder mit der integrierten Standalone-Funktion sorted() kann jeder die Methode __cmp__ umgehen, indem er eine benutzerdefinierte Vergleichsfunktion oder einen Sortierschlüssel verwendet.

%Vor%

Wie andere betonen werden, bin ich mir nicht sicher, ob es viel Wert ist, jemanden daran zu hindern, ein Objekt zu sortieren. Wenn das nicht nur ein merkwürdiges Problem ist, das Sie versuchen zu kratzen, was ist der Anwendungsfall dafür?

    
Jarret Hardie 02.03.2010 22:10
quelle
1

Die Standardsortierung der Liste verwendet die integrierte Funktion cmp() für ihre Elemente. Die Funktion cmp() überprüft, ob ihre Argumente (2 Elemente aus Ihrer Liste) eine __cmp__() -Methode haben. Wenn ja, wird diese Methode zum Vergleich verwendet. Ansonsten werden wie in Ihrem Fall die Argument-Objekt-IDs (Rückgabewert der eingebauten Funktion id() ) zum Vergleich verwendet.

Um die Sortierung fehlschlagen zu lassen, könnten Sie eine Vergleichsmethode definieren, die eine Ausnahme auslöst:

%Vor%     
Oben Sonne 02.03.2010 22:12
quelle
1

Was es wert ist, ist in Python 3 der Standardwert, dass neue Objekte nicht vergleichbar (und daher nicht sortierbar) sind. In Python 2 müssen Sie explizit eine __cmp__ oder __lt__ Methode erstellen, wie andere gesagt haben.

    
Daniel Stutzbach 04.03.2010 23:22
quelle
0

Warum schreiben Sie nicht einfach eine Klasse, die ein Listenobjekt enthält und Methoden zum Zugriff auf die darin enthaltenen Daten bereitstellt? Auf diese Weise würden Sie die Liste effektiv ausblenden und sie daran hindern, sie zu sortieren.

    
Jarsen 02.03.2010 22:07
quelle
0

Mengen haben keine Gesamtordnung

%Vor%

Aber keine Ausnahme wird ausgelöst, wenn Sie versuchen, sie zu sortieren

%Vor%     
John La Rooy 02.03.2010 22:18
quelle
0

Die Python-Sortieralgorithmen verwenden die spezielle Methode __lt__ . Beachten Sie, dass die Verwendung der Argumente cmp und key der Sortierfunktion und -methoden es empfiehlt, dass Ihre Klasse eine Methode definiert:

%Vor%     
tzot 27.03.2010 01:28
quelle

Tags und Links