66 Stimmen

Anhängen eines Wörterbuchs an eine Liste in einer Schleife

Ich versuche, ein Wörterbuch zu nehmen und es an eine Liste anzuhängen. Das Wörterbuch ändert dann Werte und wird dann in einer Schleife erneut angehängt. Es scheint, dass jedes Mal, wenn ich dies tue, alle Wörterbücher in der Liste ihre Werte ändern, um mit dem übereinzustimmen, was gerade angehängt wurde.

Zum Beispiel:

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

Ich würde annehmen, dass das Ergebnis [{1:1}, {1:2}, {1:3}... {1:98}, {1:99}] wäre, aber stattdessen habe ich Folgendes erhalten:

[{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},...

99voto

Martijn Pieters Punkte 953257

Sie müssen eine Kopie anhängen, ansonsten fügen Sie immer wieder nur Verweise auf dasselbe Wörterbuch hinzu:

yourlist.append(yourdict.copy())

Ich habe yourdict und yourlist anstelle von dict und list verwendet; Sie möchten die integrierten Typen nicht maskieren.

15voto

chapelo Punkte 2479

Wenn Sie das adict-Wörterbuch außerhalb der Schleife erstellen, hängen Sie dasselbe Wörterbuch an Ihre alist-Liste an. Das bedeutet, dass alle Kopien auf dasselbe Wörterbuch verweisen und Sie jedes Mal den letzten Wert {1:99} erhalten. Erstellen Sie einfach jedes Wörterbuch innerhalb der Schleife und jetzt haben Sie Ihre 100 verschiedenen Wörterbücher.

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

11voto

docjag Punkte 401

Setzen Sie einfach dict = {} innerhalb der Schleife.

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

>>> print list

6voto

Padraic Cunningham Punkte 168356

Sie können auch zip und List Comprehension verwenden, um das zu tun, was Sie brauchen.

Wenn Sie möchten, dass die Werte des Dicts bei eins beginnen, verwenden Sie range(1,100)

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

2voto

iNikkz Punkte 3521

Sagen wir d ist dein Wörterbuch. Hier, wenn du d.copy() machst. Es gibt eine flache Kopie, die nicht funktioniert, wenn du ein verschachteltes Wörterbuch in das Wörterbuch d hast. Um dieses Problem zu überwinden, müssen wir deepcopy verwenden.

from copy import deepcopy
list.append(deepcopy(d))

Es funktioniert perfekt !!!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X