60 Stimmen

Liste der Python-Objekte auf dict of object.id reduzieren -> object

Sie haben eine Liste von Objekten und jedes von ihnen hat eine id Eigentum.

Hier ist mein Weg, um es in dict zu konvertieren, wo Schlüssel sind ids und Werte sind Objekte:

reduce(
  lambda x,y: dict(x.items() + { y.id : y}.items()),
  list,
  {}
)

Schlagen Sie einen besseren Weg vor.

118voto

JAB Punkte 19937

In Python 3.x:

object_dict = {x.id: x for x in object_list}

Sowohl in Python 3.x als auch in Python 2.4+:

object_dict = dict((x.id, x) for x in object_list)

(x.id, x) for x in object_list ein Generatorausdruck ist (und netterweise nicht in Klammern eingeschlossen werden muss, wie ein Listenausdruck in Klammern eingeschlossen werden muss, wenn er als einzelnes Argument für einen Aufruf verwendet wird; das bedeutet natürlich, dass der von mir verwendete Ausdruck unter anderen Umständen ((x.id, x) for x in object_list) ). Im Gegensatz zu einem Listenverständnis wird keine tatsächliche Liste aller Elemente erzeugt, was in Situationen wie der vorliegenden effizienter ist.

Nebenbei bemerkt, hat Python eine eingebaute Methode id() :

Gibt die "Identität" eines Objekts zurück. Dabei handelt es sich um eine ganze Zahl, die für dieses Objekt während seiner Lebensdauer garantiert eindeutig und konstant ist. Zwei Objekte mit nicht überlappender Lebensdauer können denselben id()-Wert haben. (Hinweis zur Implementierung: Dies ist die Adresse des Objekts.)

Wenn Sie also Python die IDs selbst handhaben lassen wollen, können Sie das wie folgt tun:

object_dict = {id(x): x for x in object_list}

ou

object_dict = dict((id(x), x) for x in object_list)

13voto

tlayton Punkte 1727
dict([(x.id, x) for x in list])

0 Stimmen

Sie brauchen dort kein Listenverständnis

2 Stimmen

In der Tat. Wie in meiner Antwort erwähnt, ist ein Generatorausdruck besser.

7voto

sepp2k Punkte 352762
dict(map(lambda x: [x.id, x], list))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X