2014-05-18 8 views
16

Jestem podstawowym programistą Pythona, więc mam nadzieję, że odpowiedź na moje pytanie będzie łatwa. Próbuję wziąć słownik i dołączyć go do listy. Słownik następnie zmienia wartości, a następnie jest ponownie dołączany do pętli. Wydaje się, że za każdym razem, gdy to robię, wszystkie słowniki na liście zmieniają swoje wartości tak, aby pasowały do ​​właśnie dodanego. Na przykład:Dodawanie słownika do listy w pętli Python

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

Przypuszczam wynik byłby [{1:1}, {1:2}, {1:3}... {1:98}, {1:99}] lecz mam:

[{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}] 

Każda pomoc jest mile widziana.

+1

Jesteś napełniania 'list' (co nie powinno się nazwać' list') z odniesieniami do tych samych 'dict' (które nie powinny wymagać' dict') – jonrsharpe

Odpowiedz

32

Musisz dołączyć kopię, w przeciwnym razie jesteś po prostu dodanie odniesienia do tego samego słownika kółko:

yourlist.append(yourdict.copy()) 

użyłem yourdict i yourlist zamiast dict i list; nie chcesz maskować wbudowanych typów.

+2

także: 'yourlist'! – jonrsharpe

+0

Ach, tak, poprawione. –

2

Możesz także użyć zip i sporządzić listę ze zrozumieniem, aby zrobić to, czego potrzebujesz.

Jeśli chcesz wartości dict rozpocząć w jednym użytku range(1,100)

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

Podczas tworzenia słownika adict zewnątrz pętli, jesteś sam dict dołączenie do listy alist. Oznacza to, że wszystkie kopie wskazują na ten sam słownik i za każdym razem otrzymujesz ostatnią wartość {1:99}. Po prostu stwórz każdy słownik w pętli, a teraz masz 100 różnych słowników.

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

Wystarczy umieścić dict = {} w pętli.

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

>>> print list