2016-06-01 8 views
2

辞書を修正し、変更された値を含む辞書を含むリストを作成したいと考えています。私が試した:Python辞書の値を変更して辞書のリストを作成するには?

mylist = [] 
mydict = {"one": 10, "two": 20, "three": 30} 
for i in [111, 222, 333]: 
    mydict["two"] = i 
    mylist.append(mydict) 

マイリストに戻ります:

[{'three': 30, 'two': 333, 'one': 10}, {'three': 30, 'two': 333, 'one': 10}, {'three': 30, 'two': 333, 'one': 10}] 

私が得ることを期待:

[{'three': 30, 'two': 111, 'one': 10}, {'three': 30, 'two': 222, 'one': 10}, {'three': 30, 'two': 333, 'one': 10}] 

私はそれをどのように行うことができますか?

答えて

4

あなただけの同じオブジェクトに複数の参照を作成する(辞書)と最後の繰り返しで333を保持し、twoキーに割り当てあなたの鍵に使い捨ての変数iを割り当てることによって、あなたの辞書名のすべてが意志されているためですアイテム('two', 333)の同じオブジェクトをポイントします。

あなたは、この問題の乗車を取得するためのdictの内包表記を使用することができます:あなたは新しいオブジェクトを作成するためだけではなく、参照をコピーするには、各反復では、あなたの最初のオブジェクトのコピーを作成することができます

>>> mylist = [{"one": 10, "two": i, "three": 30} for i in [111, 222, 333]] 
>>> mylist 
[{'three': 30, 'two': 111, 'one': 10}, {'three': 30, 'two': 222, 'one': 10}, {'three': 30, 'two': 333, 'one': 10}] 

または

>>> from copy import copy 
>>> mylist = [] 
>>> mydict = {"one": 10, "two": 20, "three": 30} 
>>> for i in [111, 222, 333]: 
... mydict["two"] = i 
... mylist.append(copy(mydict)) 
... 
>>> mylist 
[{'one': 10, 'three': 30, 'two': 111}, {'one': 10, 'three': 30, 'two': 222}, {'one': 10, 'three': 30, 'two': 333}] 

そして、あなたはあなたが行うことができ、より神託のアプローチとして、変更したい複数のキーがある場合:迅速な対応のための

>>> for i, j in zip(my_keys, my_new_values): 
... mydict[i] = j 
... mylist.append(copy(mydict)) 
+0

感謝を。それは作品です。追加の質問、私は2つ以上の値を非常に長い辞書を変更したい場合。堅牢で洗練されたソリューションがありますか? – dmaster

+0

@dmaster編集をチェックしてください。 – Kasramvd

関連する問題