web-dev-qa-db-fra.com

Réduisez la liste des objets Python pour dicter object.id -> object

Vous avez une liste d'objets et chacun d'eux a une propriété id.

Voici ma façon de le convertir pour dicter où les clés sont des identifiants et les valeurs sont des objets:

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

Suggérez une meilleure façon de le faire.

39
Dmitry Teslenko

Dans Python 3.x:

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

Dans les deux Python 3.x et Python 2.4+:

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

(x.id, x) for x in object_list Est une compréhension de générateur (et, joliment, n'a pas besoin d'être entouré de parenthèses comme une compréhension de liste doit être entourée de crochets si elle est utilisée comme argument unique pour un appel; bien sûr, cela signifie que dans d'autres circonstances, l'expression que j'utiliserais devrait être ((x.id, x) for x in object_list)). Contrairement à une compréhension de liste, elle ne générera pas une liste réelle de tous les éléments, et est donc plus efficace dans des situations comme celle-ci.

En guise de remarque, Python a une méthode intégrée id():

Renvoie "l'identité" d'un objet. Il s'agit d'un entier qui est garanti unique et constant pour cet objet pendant sa durée de vie. Deux objets dont la durée de vie ne se chevauche pas peuvent avoir la même valeur id (). (Note d'implémentation: c'est l'adresse de l'objet.)

Donc, si vous vouliez laisser Python gérer les ids par lui-même, vous pouvez le faire comme:

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

ou

object_dict = dict((id(x), x) for x in object_list)
73
JAB
dict([(x.id, x) for x in list])
11
tlayton
dict(map(lambda x: [x.id, x], list))
6
sepp2k