2013-05-20 26 views
8

在Python中,用列表理解或类似的方式更新对象列表是否可能? 例如,我想集中的所有对象的属性列表: 以列表理解方式更新对象属性

result = [ object.name = "blah" for object in objects] 

map功能

result = map(object.name = "blah", objects) 

难道不换循环与属性设置来实现?

(注:以上的例子是故意错,只提供表达的想法)

+0

我最近编写了很多javascript,其中类似这样的东西是可能的:'const result = objects.map(object => object.name ='blah')'所以这是一点点的上下文切换回到python。 – cosmosa

回答

20

最终,分配是一个“声明”,而不是“表达”,因此它不能在拉姆达使用表达或列表理解。你需要一个常规功能来完成你正在尝试的功能。

有一个内置的,将做到这一点(返回的None列表):

[setattr(obj,'name','blah') for obj in objects] 

请不要使用它。只需使用一个循环。我怀疑你会注意到效率上的差异,而循环更清晰。

如果你真的需要一个1衬(虽然我不明白为什么):

for obj in objects: obj.name = "blah" 

我发现大多数人希望使用列表推导,因为有人告诉他们,他们是“快速”。这是正确的,但仅用于创建新列表。使用列表理解副作用不太可能会带来任何性能优势,并且您的代码在可读性方面会受到影响。真的,使用列表理解而不是等效循环与.append最重要的原因是因为它更易于阅读。

+0

我同意100%,你应该真的不这样做,但如果你必须这样做,至少将转换封装到一个返回Falsey值的函数中,并在理解中使用if条件来应用它,所以当您只是想要进行转换时,您不会生成全新的列表。 –

+1

@ sr2222 - 我想你*可以做到这一点:'[如果setattr(obj,'name','blah')]'对象中没有obj,但这比我的版本更不明显。 Persionally,我会说'None'的列表比这种方法造成的混乱更加严重。但无论如何 - 都不应该使用。使用循环:) – mgilson

+0

那么,列表解析不应该用于副作用,因为它只是使代码难以阅读。但是如果你打算使用列表理解来产生副作用,那么你至少应该尝试以不会产生无用工件的方式去做。就可读性而言,我并不认为任何人都清楚。 :) –