2014-05-18 8 views
16

Sono un programmatore Python di base quindi spero che la risposta alla mia domanda sarà facile. Sto provando a prendere un dizionario e aggiungerlo ad una lista. Il dizionario cambia quindi i valori e quindi viene nuovamente aggiunto in un ciclo. Sembra che ogni volta che lo faccio, tutti i dizionari nella lista cambiano i loro valori in modo che corrispondano a quelli appena aggiunti. Per esempio:Aggiunta di un dizionario a un elenco in un loop Python

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

Vorrei assumere il risultato sarebbe [{1:1}, {1:2}, {1:3}... {1:98}, {1:99}] ma invece ho ottenuto:

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

Qualsiasi aiuto è molto apprezzato.

+1

Si sta riempiendo 'list' (che non si dovrebbe chiamare' list') con riferimenti alle stesse 'dict' (che non si dovrebbe chiamare' dict') – jonrsharpe

risposta

32

È necessario aggiungere una copia , altrimenti si sta solo aggiungendo i riferimenti per lo stesso dizionario più e più volte:

yourlist.append(yourdict.copy()) 

Ho usato yourdict e yourlist invece di dict e list; non vuoi mascherare i tipi integrati.

+2

Inoltre: 'yourlist'! – jonrsharpe

+0

Ah, sì, corretto. –

2

È inoltre possibile utilizzare zip e comprendere l'elenco per fare ciò che è necessario.

Se si desidera che i valori dict a partire dal numero uno uso range(1,100)

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

Quando si crea il dizionario adict al di fuori del ciclo, si sta aggiungendo la stessa dict alla tua lista alist. Significa che tutte le copie puntano allo stesso dizionario e ottieni sempre l'ultimo valore {1:99}. Basta creare tutti i dizionari all'interno del ciclo e ora hai i tuoi 100 dizionari diversi.

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

Inserire semplicemente dict = {} all'interno del ciclo.

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

>>> print list