web-dev-qa-db-ja.com

ループ内のリストに辞書を追加するPython

私は基本的なpythonプログラマーなので、質問に対する答えが簡単になることを願っています。辞書を取り、リストに追加しようとしています。辞書は値を変更してから再び追加されますこれを行うたびに、リスト内のすべての辞書の値が、追加されたばかりの辞書と一致するように変更されるようです。

>>> dict = {}
>>> list = []
>>> for x in range(0,100):
...     dict[1] = x
...     list.append(dict)
... 
>>> print list

結果は[{1:1}, {1:2}, {1:3}... {1:98}, {1:99}]しかし、代わりに私は得た:

[{1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}]

どんな助けも大歓迎です。

27
Acoop

copyを追加する必要があります。追加しないと、同じ辞書への参照を何度も繰り返し追加することになります。

yourlist.append(yourdict.copy())

yourdictyourlist;の代わりにdictlistを使用しました。組み込み型をマスクする必要はありません。

51
Martijn Pieters

ただdict = {}ループ内。

>>> dict = {}
>>> list = []
>>> for x in range(0, 100):
       dict[1] = x
       list.append(dict)
       dict = {}

>>> print list
4
docjag

ループ外でadict辞書を作成すると、alistリストに同じ辞書が追加されます。これは、すべてのコピーが同じ辞書を指し、最後の値{1:99} 毎回。ループ内ですべての辞書を作成するだけで、100種類の辞書が作成されます。

alist = []
for x in range(100):
    adict = {1:x}
    alist.append(adict)
print(alist)
4
chapelo

Zipとリスト内包表記を使用して、必要なことを行うこともできます。

Dict値を1から開始する場合は、range(1,100)を使用します

l = [dict(Zip([1],[x])) for x in range(1,100)]
2