Уменьшить список объектов Python до dict object.id -> object - PullRequest
32 голосов
/ 18 июня 2010

У вас есть список объектов, и у каждого из них есть свойство id.

Вот мой способ преобразовать его, чтобы определить, где ключи - это идентификаторы, а значения - объекты:

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

Предложите лучший способ сделать это.

Ответы [ 3 ]

61 голосов
/ 18 июня 2010

В Python 3.x:

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

В Python 3.x и Python 2.4 +:

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

(x.id, x) for x in object_list - это генераторное понимание (и, к счастью, его не нужно заключать в скобки, так как понимание списка необходимо заключать в скобки, если оно используется в качестве единственного аргумента для вызова; конечно, это означает, что что в других обстоятельствах выражение, которое я использовал, должно быть ((x.id, x) for x in object_list)). В отличие от понимания списка, он не будет генерировать фактический список всех элементов и, следовательно, более эффективен в ситуациях, подобных этой.

Как примечание, в Python есть встроенный метод id():

Возвращает «идентичность» объекта. Это целое число, которое гарантированно будет уникальным и постоянным для этого объекта в течение его жизни. Два объекта с неперекрывающимися временами жизни могут иметь одинаковое значение id (). (Примечание по реализации: это адрес объекта.)

Поэтому, если вы хотите, чтобы Python самостоятельно обрабатывал идентификаторы, вы можете сделать это следующим образом:

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

или

object_dict = dict((id(x), x) for x in object_list)
9 голосов
/ 18 июня 2010
dict([(x.id, x) for x in list])
4 голосов
/ 18 июня 2010
dict(map(lambda x: [x.id, x], list))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...