在Python中有更好的方法来实现这一点吗?

在Python中有更好的方法来实现这一点吗?,python,Python,您可以使用列表: ids = [] for object in objects: ids += [object.id] ids = map(lambda x: x.id, objects) 供参考: 两者产生相同的结果。在许多情况下,列表理解是一种优雅的方法,与您提到的方法相同。另一种方法: ids = [object.id for object in objects] 标准(即“pythonic”又称为cleanset:)方法是使用列表理解: ids = [] for ob

您可以使用列表:

ids = []

for object in objects:
  ids += [object.id]
ids = map(lambda x: x.id, objects)
供参考:

两者产生相同的结果。在许多情况下,列表理解是一种优雅的方法,与您提到的方法相同。

另一种方法:

ids = [object.id for object in objects]
标准(即“pythonic”又称为cleanset:)方法是使用列表理解:

ids = []

for object in objects:
  ids += [object.id]
ids = map(lambda x: x.id, objects)
以上内容适用于所有Python版本≥ 2.0

其他方式(仅供参考) 在Python 2中,您还可以执行以下操作:

ids= [obj.id for obj in objects]
哪种方法应该是最慢的,或者

ids= map(lambda x: x.id, objects)
哪种可能是最快的方法,尽管我认为差别不会太大;无论哪种方式,列表理解的清晰性都超过了速度的提高

如果希望在Python 3中使用另一种方法,则应将
映射
调用包含在
列表
调用中:

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

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

您不需要运算符模块:

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

请注意,
ids+=[object.id]
通常简单地写为
ids.append(object.id)
@Tumbleweed:
object
不是关键字,它是一个内置函数。如果它是一个关键字,这段代码将引发一个
SyntaxError
。你可以纠正它的内置类型-但我建议不要替换它!!在这种情况下,列表理解的速度是映射
lambda
的两倍,而映射
attrgetter('id')
的速度大约是映射
attrgetter('id')
的10%(我也很惊讶)@亚伦:我也很惊讶;请提供一些示例
对象
,其中
lambda
比映射
attrgetter
更快;如果
id
是一个简单的属性(即不是一个属性),
attrgetter
应该比
lambda
快。我使用的测试是
class Foo(object):def\uu init\uuuuu(self,id):self.id=id\uu
。时间是线性的,所以如果列表中有一个元素或10000个元素,它没有什么区别。@aaron:是的,这里的结果是一样的。“永远不要猜测,永远不要浪费时间”这个古老的建议适用于:)@aaron:操作符中出现了一个问题。c代码在处理虚线名称的能力之后,attrgetter的速度变慢了;我已经提交了一份报告,再次使
attrgetter
的运行速度几乎是
lambda
的两倍。希望这个问题能够得到解决。(而且,哇:从上半夜开始,我的英语使用率急剧下降;我需要一些睡眠)。这也为对象函数的隐藏提供了最小的空间。不知何故,在这一点上看起来也不像原来那么糟糕。我也很好奇,鲁比克。也许有人对这个名字有清教徒的信仰。无论如何,我已经把你带回了零,谢谢。但我通常在不需要计数器的循环中使用“\uIn”…我没有投票反对你,但实际上有很好的理由不使用
\ucode>作为临时变量。由于变量仍在当前范围内,因此不能在同一函数中再使用gettext的
\uu
(如果将
gettext.gettext
导入为
\u
进行翻译)。我通常将这些变量称为“unused”或“unused_xyz”,因为这样PyDev就不会显示关于它实际未使用的警告。