Reduce list of Python objects to dict of object.id -> object

PythonLambdaDictionary

Python Problem Overview


You have list of objects and each of them has an id property.

Here's my way to convert it to dict where keys are ids and values are objects:

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

Suggest better way to do it.

Python Solutions


Solution 1 - Python

In Python 3.x:

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

In both Python 3.x and Python 2.4+:

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

(x.id, x) for x in object_list is a generator comprehension (and, nicely, does not need to be wrapped in parentheses like a list comprehension needs to be wrapped in brackets if it's being used as a single argument for a call; of course, this means that in other circumstances the expression I used would have to be ((x.id, x) for x in object_list)). Unlike a list comprehension, it will not generate an actual list of all the items, and is thus more efficient in situations such as this.

As a side note, Python has a built-in method id():

> Return the “identity” of an object. This is an integer which is guaranteed to be unique and constant for this object during its lifetime. Two objects with non-overlapping lifetimes may have the same id() value. (Implementation note: this is the address of the object.)

So if you wanted to let Python handle the ids on its own, you could do it as:

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

or

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

Solution 2 - Python

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

Solution 3 - Python

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDmitry TeslenkoView Question on Stackoverflow
Solution 1 - PythonJABView Answer on Stackoverflow
Solution 2 - PythontlaytonView Answer on Stackoverflow
Solution 3 - Pythonsepp2kView Answer on Stackoverflow