2015-07-31 17 views
5

ich einige Objekte auf einem ihrer Attribute basierend sortieren, so etwas wie dies mit:Listen von Objekten mit benutzerdefinierten Schlüssel Vergleich

sorted_list = sorted(unsorted_list, key=lambda x: x.my_attr) 

Gibt es eine Möglichkeit, eine Liste von Listen dieser Objekte zu sortieren, in der gleichen Wie kann Python Listen von Ganzzahlen sortieren? Ich kann __cmp__(self, other) für diese Objekte überladen, aber das wirft Schwierigkeiten in einem externen Paket auf. Die Verschachtelung kann auch beliebig tief werden, also glaube ich nicht, dass ich nur ein Listenverständnis verwenden kann.

Ich fragte mich, ob es etwas gab, wo ich Listen der my_attr s erzeugen und diese mit den entsprechenden Listen von Objekten verknüpfen konnte. Ich kann mir keine nette Art vorstellen, es ohne weiteres zu tun.

+0

können Sie Beispiele für Ihre verschachtelten Listen anzeigen, vielleicht gibt es einen besseren Weg, dies zu tun, ohne Listen von 'my_attr' zu erzeugen. ? Enthalten ist auch die erwartete Ausgabe – styvane

+0

'[[340 NN, 338 CC], [344 C CB, 350 C CG1], [357 CC, 358 OO], [343 H HA]] Dies ist ein Beispiel für die erste Ebene von Rekursion. Die Objekte sind Atome, und was ich versuche, zu sortieren, basiert auf den [Cahn Ingold Prelog-Regeln] (https://en.wikipedia.org/wiki/Cahn%E2%80%93Ingold%E2%80%93Prelog_priority_rules) #Assignment_von_Prioritäten). Es ist die Erweiterung in Schritt 2, die die Verschachtelung verursacht, und das Attribut, das ich verwende, ist die Atomzahl des Atoms. –

+3

Sie sollten Ihre Frage bearbeiten und hinzufügen (http://stackoverflow.com/posts/31751232/edit). – styvane

Antwort

0

Sie können Vergleichsfunktionen für Ihren Datentyp implementieren und sich dann auf die Sortierfunktionen von Python verlassen.

Siehe ähnliche Fragen und Antworten: Python: Sort custom class without use of `key` argument?

Kurz gesagt, Sie total_ordering Meta-Klasse verwenden können, und __eq__ und __lt__ Funktionen implementieren. für __lt__

def __eq__(self, other): 
    return self.my_attr == other.my_attr 

und ähnlich:

In Ihrem speziellen Fall können Sie __eq__ wie diese umzusetzen.

Verwandte Themen