Подтвердить что ты не робот

Уменьшить список объектов python до объекта dict.id → object

У вас есть список объектов, у каждого из которых есть свойство id. Здесь мой способ скрывать его до dict, где ключи являются идентификаторами и значениями, являются объектами:

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

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

4b9b3361

Ответ 1

В 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)

Ответ 2

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

Ответ 3

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