在Python中,用列表理解或类似的方式更新对象列表是否可能? 例如,我想集中的所有对象的属性列表: 以列表理解方式更新对象属性
result = [ object.name = "blah" for object in objects]
或map
功能
result = map(object.name = "blah", objects)
难道不换循环与属性设置来实现?
(注:以上的例子是故意错,只提供表达的想法)
在Python中,用列表理解或类似的方式更新对象列表是否可能? 例如,我想集中的所有对象的属性列表: 以列表理解方式更新对象属性
result = [ object.name = "blah" for object in objects]
或map
功能
result = map(object.name = "blah", objects)
难道不换循环与属性设置来实现?
(注:以上的例子是故意错,只提供表达的想法)
最终,分配是一个“声明”,而不是“表达”,因此它不能在拉姆达使用表达或列表理解。你需要一个常规功能来完成你正在尝试的功能。
有一个内置的,将做到这一点(返回的None
列表):
[setattr(obj,'name','blah') for obj in objects]
但请不要使用它。只需使用一个循环。我怀疑你会注意到效率上的差异,而循环更清晰。
如果你真的需要一个1衬(虽然我不明白为什么):
for obj in objects: obj.name = "blah"
我发现大多数人希望使用列表推导,因为有人告诉他们,他们是“快速”。这是正确的,但仅用于创建新列表。使用列表理解副作用不太可能会带来任何性能优势,并且您的代码在可读性方面会受到影响。真的,使用列表理解而不是等效循环与.append
最重要的原因是因为它更易于阅读。
我同意100%,你应该真的不这样做,但如果你必须这样做,至少将转换封装到一个返回Falsey值的函数中,并在理解中使用if条件来应用它,所以当您只是想要进行转换时,您不会生成全新的列表。 –
@ sr2222 - 我想你*可以做到这一点:'[如果setattr(obj,'name','blah')]'对象中没有obj,但这比我的版本更不明显。 Persionally,我会说'None'的列表比这种方法造成的混乱更加严重。但无论如何 - 都不应该使用。使用循环:) – mgilson
那么,列表解析不应该用于副作用,因为它只是使代码难以阅读。但是如果你打算使用列表理解来产生副作用,那么你至少应该尝试以不会产生无用工件的方式去做。就可读性而言,我并不认为任何人都清楚。 :) –
我最近编写了很多javascript,其中类似这样的东西是可能的:'const result = objects.map(object => object.name ='blah')'所以这是一点点的上下文切换回到python。 – cosmosa