将对象列表减少为object.id - > object的dict

Dmi*_*nko 36 python lambda dictionary

您有对象列表,每个对象都有一个id属性.

这是我的方法来将它转换为dict,其中键是id,值是对象:

reduce(
  lambda x,y: dict(x.items() + { y.id : y}.items()),
  list,
  {}
)
Run Code Online (Sandbox Code Playgroud)

建议更好的方法来做到这一点.

JAB*_*JAB 69

在Python 3.x中:

object_dict = {x.id: x for x in object_list}
Run Code Online (Sandbox Code Playgroud)

在Python 3.x和Python 2.4+中:

object_dict = dict((x.id, x) for x in object_list)
Run Code Online (Sandbox Code Playgroud)

(x.id, x) for x in object_list是发电机理解(并且,很好,不需要像需要被包裹在括号如果它被用作一个呼叫一个参数列表解析被包裹在括号中;当然,这意味着,在其他情况下,表达我曾经使用过((x.id, x) for x in object_list)).不像一个列表理解,也不会产生所有项目的实际列表,因此在情况下更有效,如这一点.

作为旁注,Python有一个内置方法id():

返回对象的"标识".这是保证是用于在其寿命期间该对象独特和恒定的整数.具有非重叠生存期的两个对象可以具有相同的id()值.(实施说明:这是对象的地址.)

所以,如果你想让Python中处理自身的ID,你可以做到这一点的:

object_dict = {id(x): x for x in object_list}
Run Code Online (Sandbox Code Playgroud)

要么

object_dict = dict((id(x), x) for x in object_list)
Run Code Online (Sandbox Code Playgroud)


tla*_*ton 11

dict([(x.id, x) for x in list])
Run Code Online (Sandbox Code Playgroud)

  • 的确。正如我的回答所述,生成器表达式更好。 (2认同)

sep*_*p2k 6

dict(map(lambda x: [x.id, x], list))
Run Code Online (Sandbox Code Playgroud)