在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就不会显示关于它实际未使用的警告。