2017-05-02 11 views
3

リスト内の1つ以上のアイテムを置換する必要があります。私の腸の反応は、このようなものになるだろう:リスト内の1つ以上のアイテムを置換する「Pythonic」方法

mylist = [...] 
other_object = dict(spam='eggs', a_list=mylist) 

def replacer(item): 
    ... contents not shown, returns a replacement ... 

mylist[:] = [replacer(item) for item in mylist] 
それは私が参照して他のオブジェクト(上の例では例えば other_object)を持っているならば、それらの他のオブジェクトが意志、mylistになるように、その場でする必要があります

更新された値を参照してください。 (明確化:私はは、それが私が維持コードから別の場所で管理されているので、other_objectを変更する必要はしたくない)

これはPythonでそれを行うには、最も慣用的な方法ですか?そうでない場合は、よりよい方法がありますか?

+1

慣用的なやり方ではなく、それを気にするものに渡すことができる新しいオブジェクトを返すことです。 – Daenyth

+2

いいえ、それは機能的なやり方ではなく、私がやりたいことです。しかし、私はこの場合はできません。 –

+0

mylist = [mylistのアイテムのreplacer(アイテム)] – Muposat

答えて

4

だけでなく、独自のソリューションは、私にはかなり細かい聞こえる:私は他の多くの方法を想像することができる

for idx, val in enumerate(mylist): 
    mylist[idx] = replacer(val) 

、しかし:

mylist[:] = [replacer(item) for item in mylist] 

またはあなたがより明示的なしかし、冗長な方法でそれを行うことができます私はそれらを示唆している場合


other_objectのことを実証焼けと地獄に禁止されるだろうEES変更:

>>> def replacer(x): 
...  return x+2 
... 
>>> mylist = [1,2,3] 
>>> other_object = dict(spam='eggs', a_list=mylist) 
>>> mylist[:] = [replacer(item) for item in mylist] 
>>> mylist, other_object['a_list'] 
([3, 4, 5], [3, 4, 5]) 

あなたは♥

+0

これらのアプローチのどちらも、OPが要求したように、 'other_object'を更新しません。 – blacksite

+3

@not_a_robotこれらのアプローチは、リストを変更します。これは 'other_object'に含まれるリストです。変更がそこに反映されるためにコードは 'other_object'に触れる必要はありません。 –

+0

@not_a_robotなぜそれを言うのですか? – fedeisas

2

歓迎しているあなたはそれを直接行うことができますどこにでも元my_listが使用されている、それはスライスの割り当てを使用して変更されること

>>> my_list=[1,2,3] 
>>> other_obj={'eggs':my_list} 
>>> my_other_list=[[1,2,3],my_list] 
>>> other_obj['eggs'][:]=[e+2 for e in other_obj['eggs']] 
>>> other_obj 
{'eggs': [3, 4, 5]} 
>>> my_other_list 
[[1, 2, 3], [3, 4, 5]] 
>>> my_list 
[3, 4, 5] 

お知らせこれらの名前のいずれかに:

>>> my_other_list[1][:]=[20,30,40] 
>>> my_list 
[20, 30, 40] 
>>> other_obj 
{'eggs': [20, 30, 40]} 

その他のNed Batchelder:あなたの編集に基づいて


:ちょうどmylistインプレースを変更すると、それは(mylistのコピーではなく)mylistが使用されている他のオブジェクトに変更されます。場所を変更する方法を使用することができます。

例:

>>> my_list[:]=['new','inserted','items'] 

他の2つのオブジェクトがあまりにも変更します。他のプログラム/プロセスは、あなたの知識がなくても名前の参照を変更することができますので、これらは「共有」オブジェクトである場合

>>> other_obj 
{'eggs': ['new', 'inserted', 'items']} 
>>> my_other_list 
[[1, 2, 3], ['new', 'inserted', 'items']] 

ちょうど用心します。潜在的に卑劣なバグ。

関連する問題