So erhalten Sie eine Liste von Objekten mit einem eindeutigen Attribut

7

Hintergrund

Ich habe ein list . Dieser list hat viele Objekte. Jedes Objekt hat id . Jetzt sind die Objekte von verschiedenen Typen.

%Vor%

wo

%Vor%

Problem

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)

    
Akamad007 05.04.2012, 07:51
quelle

6 Antworten

14
%Vor%

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.

    
Marcin 05.04.2012, 07:59
quelle
2

Angesichts Ihrer Liste von Objekt somelist etwas wie

sein %Vor%

Sie können so etwas tun

%Vor%     
Abhijit 05.04.2012 08:24
quelle
1

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

generiert werden %Vor%

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:

Benchmark

%Vor%

auf meinem Rechner gibt

%Vor%     
Azat Ibrakov 08.03.2018 08:49
quelle
0

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%     
Andreas Florath 05.04.2012 08:14
quelle
0

Sie können das Satzverständnis (effizient und unkompliziert) so einfach wie folgt verwenden:

unique_list = list({obj for obj in mylist if obj})

    
DhiaTN 08.03.2018 12:20
quelle
-1

Eine ziemlich einfache Methode wäre

%Vor%

Und das sollte jede ID hinzufügen, die nicht gesehen wurde. Die Zeit ist linear von der Größe der Quellenliste.

    
Nathan S. 05.04.2012 08:11
quelle

Tags und Links