有没有更好的方法在Python中执行此操作?

时间:2010-10-15 08:12:15

标签: python

ids = []

for object in objects:
  ids += [object.id]

4 个答案:

答案 0 :(得分:27)

您可以使用列表理解:

ids = [object.id for object in objects]

供您参考:

两者产生相同的结果。在许多情况下,列表理解是一种优雅和pythonic的方式来做与你提到的相同。

答案 1 :(得分:4)

标准(即“pythonic”a.k.a cleanest :)方式是使用列表理解:

ids= [obj.id for obj in objects]

以上适用于所有Python版本≥2.0。

其他方式(仅供参考)

在Python 2中,你也可以这样做:

ids= map(lambda x: x.id, objects)

哪个应该是最慢的方法,或

# note: Python ≥ 2.4
import operator
ids= map(operator.attrgetter('id'), objects)

哪个可能是最快的方法,尽管我认为差异不会那么大;无论哪种方式,列表理解的清晰度都超过了速度增益。

如果您想在Python 3中使用其他方法,则应将map调用括在list来电中:

ids= list(map(operator.attrgetter('id'), objects))

因为map内置函数返回生成器而不是Python 3中的列表。

答案 2 :(得分:3)

另一种方式:

ids = map(lambda x: x.id, objects)

答案 3 :(得分:1)

您不需要操作员模块:

In [12]: class Bar(object):
             def __init__(self, id_):
                 self.id = id_         

In [15]: foo = [Bar(1) for _ in xrange(10000)]

In [16]: foobar = map(lambda bar: getattr(bar, 'id'), foo)

In [17]: len(foobar)
Out[17]: 10000

In [18]: foobar[:10]
Out[18]: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]