2013-05-20 29 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

那麼,列表解析不應該用於副作用,因爲它只是使代碼難以閱讀。但是如果你打算使用列表理解來產生副作用,那麼你至少應該嘗試以不會產生無用工件的方式去做。就可讀性而言,我並不認爲任何人都清楚。 :) –