Ich habe ein list
.
Dieser list
hat viele Objekte. Jedes Objekt hat id
. Jetzt sind die Objekte von verschiedenen Typen.
wo
%Vor% Ich möchte ein list
von einzigartigen Objekten basierend auf object.id
.
In etwa so:
%Vor%(Das funktioniert nicht. Aber ich möchte so etwas)
Das funktioniert, weil set.add
None
zurückgibt, also liefert der Ausdruck im Listenverständnis immer obj
, aber nur wenn obj.id
nicht bereits zu seen
hinzugefügt wurde.
(Der Ausdruck konnte nur zu None
ausgewertet werden, wenn obj is None
; in diesem Fall würde obj.id
eine Ausnahme auslösen. Falls mylist
None
-Werte enthält, ändern Sie den Test in if obj and (obj.id not in seen)
)
Beachten Sie, dass Sie damit das erste Objekt in der Liste mit einer bestimmten ID erhalten. @ Abhijits Antwort wird dir das letzte solche Objekt geben.
Wie wäre es mit dict
(da seine Schlüssel eindeutig sind)?
Angenommen, wir haben
%Vor% then list
mit Object
s unique von id
field kann mit dict
encryption in Python 3
in Python 2.7
%Vor%und in Python & lt; 2.7
%Vor%Schließlich können wir Funktion schreiben ( Python 3 Version)
%Vor% wobei elements
eine beliebige iterable
und key
etwas callable
sein kann, die hashable
Objekte von elements
( key=operator.attrgetter('id')
in unserem speziellen Fall) zurückgibt.
Marcins Antwort funktioniert gut, aber sehen Sie mir Pythonic nicht an, da das Verständnis der Liste seen
-Objekt vom äußeren Bereich mutiert , es gibt auch eine gewisse Magie hinter der Verwendung von set.add
Methode und Vergleich dessen Ergebnis (das ist None
) mit obj
.
Und letzter, aber nicht weniger wichtiger Teil:
auf meinem Rechner gibt
%Vor%Wenn Sie die Klasse der Objekte ändern können, können Sie die entsprechenden Methoden hinzufügen, die im Set-Vergleich verwendet werden:
%Vor%Ausgabe:
%Vor%