Domanda

Ho bisogno di eliminare un k / v coppia da un dizionario in un ciclo. Dopo aver ottenuto RuntimeError: dictionary changed size during iteration ho salamoia il dizionario dopo aver cancellato il k / v e in una delle anse esterni provo a riaprire il dizionario di recente in salamoia / aggiornato. Tuttavia, come molti di voi probabilmente sapete, ottengo lo stesso errore, penso che quando raggiunge la parte superiore del ciclo. Io non uso il mio dizionario nel ciclo più esterno.

Quindi la mia domanda è, qualcuno sa come aggirare questo problema? Voglio cancellare una coppia di k / V da un dizionario e l'uso che ridimensionata dizionario sulla prossima iterazione del ciclo.

per mettere a fuoco il problema e utilizzare la soluzione da Cygil

list=[27,29,23,30,3,5,40]
testDict={}
for x in range(25):
    tempDict={}
    tempDict['xsquared']=x*x
    tempDict['xinverse']=1.0/(x+1.0)
    testDict[(x,x+1)]=tempDict

for item in list:
    print 'the Dictionary now has',len(testDict.keys()), ' keys'
    for key in testDict.keys():
        if key[0]==item:

        del testDict[key]

sto facendo questo perché devo avere alcuni assistenti di ricerca confrontano alcune osservazioni da due insiemi di dati che non poteva essere abbinati a causa di varianti di nomi. L'idea è quella di lanciare un nome da un set di dati (dire impostare A) e poi sulla base di una partita fondamentale trovare tutti i nomi collegati a quella chiave nel file di dati (set B). Uno un match è stato identificato Io non voglio mostrare il valore da B di nuovo per accelerare le cose per loro. Perché ci sono 6.000 osservazioni anche io non voglio che abbiano a cominciare dall'inizio di A ogni volta che tornare al lavoro. Tuttavia, posso risolvere che, consentendo loro hanno scelto di inserire l'ultima chiave dalla A hanno lavorato con. Ma ho davvero bisogno di ridurre B una volta che è stato identificato il match

È stato utile?

Soluzione

Senza codice, sto supponendo che si sta scrivendo qualcosa come:

for key in dict:
    if check_condition(dict[key]):
       del dict[key]

Se è così, è possibile scrivere

for key in list(dict.keys()):
    if key in dict and check_condition(dict[key]):
        del dict[key]

list(dict.keys()) restituisce una copia delle chiavi, non una vista, il che permette di cancellare dal dizionario (che si sta scorrendo una copia delle chiavi, non le chiavi nel dizionario stesso, in questo caso).

Altri suggerimenti

Elimina tutte le chiavi il cui valore è> 15:

for k in mydict.keys(): # makes a list of the keys and iterate
                        # over the list, not over the dict.
    if mydict[k] > 15:
        del mydict[k]

Modifica:

for ansSeries in notmatched:

A:

for ansSeries in notmatched.copy():
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top