2013-05-20 11 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] 

しかし、それを使用しないでください。ちょうどループを使用してください。私はあなたが効率の違いに気づくことは疑い、ループははるかに明確です。

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

は、私は、誰かが彼らに言ったので、ほとんどの人は、彼らがしていることをリスト内包表記を使用することを見つける:(なぜ私は表示されませんが)あなたが本当に1-ライナーが必要な場合は

"速い"。それは正しいですが、新しいリストを作成するためだけです。副作用のためのリストの理解を使用することは、パフォーマンス上の利点につながる可能性は低く、コードは読みやすさの点で問題になります。実際には、.appendの同等のループではなく、リストの理解度を使用する最も重要な理由は、読みやすいためです。

+0

私はあなたが本当にこれをしてはいけないと100%合意しますが、もしこれをしなければならない場合、Falseyの値を返す関数に変換をカプセル化し、それを適用するために 'if'その場で変換したいときには、新しいリスト全体を生成する必要はありません。 –

+1

@ sr2222 - setattr(obj、 'name'、 'blah') 'のようなオブジェクトではobjのためのオブジェクトはありませんが、それは私のバージョンよりもはっきりしません。 Persionally、私は 'None'のリストは、このアプローチからの混乱の増加よりも悪いことではないと言いたいと思います。しかし、いずれにせよ、どちらも使用すべきではありません。ループを使用してください: – mgilson

+0

リストの理解は、コードを読みにくくするため、副作用として使用するべきではありません。しかし、あなたが副作用のリストの理解を使用しようとしている場合は、少なくとも無駄なアーティファクトを生成しない方法でそれをしようとする必要があるようです。限り、私は本当にいずれかが明確だとは思わない読みやすさまで。 :) –

関連する問題