Pregunta

Necesito eliminar un k / v par de un diccionario en un bucle. Después de conseguir RuntimeError: dictionary changed size during iteration I en escabeche el diccionario después de eliminar el k / v y en uno de los bucles externos trato de volver a abrir el diccionario de nueva escabeche / modificada. Sin embargo, como muchos de ustedes probablemente saben-me sale el mismo error-Creo que cuando se llega a la parte superior del bucle. No uso mi diccionario en el bucle más externo.

Así que mi pregunta es, ¿alguien sabe cómo solucionar este problema? Quiero borrar un par de K / V de un diccionario y el uso que se cambia el tamaño de diccionario en la siguiente iteración del bucle.

para enfocar el problema y utilizar la solución de 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]

Estoy haciendo esto porque tengo que tener algunos asistentes de investigación se comparan algunas observaciones a partir de dos conjuntos de datos que no pudieron ser igualados a causa de las variantes de nombres. La idea es lanzar un nombre de un conjunto de datos (digamos el conjunto A) y luego sobre la base de un partido clave encontrar todos los nombres unidos a esa tecla en el otro conjunto de datos (serie B). Uno un partido se ha identificado que no quiero para mostrar el valor de B de nuevo para acelerar las cosas para ellos. Debido a que hay 6.000 observaciones Asimismo, no queremos que tengan que empezar por el principio de una cada vez que vuelvan a trabajar. Sin embargo, puedo arreglar eso por lo que les eligieron para entrar en la última clave de la A trabajaron con. Pero realmente necesito para reducir B una vez que el partido ha sido identificado

¿Fue útil?

Solución

Sin código, estoy asumiendo que usted está escribiendo algo como:

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

Si es así, puede escribir

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

list(dict.keys()) devuelve una copia de las llaves, no es una vista, lo que hace que sea posible suprimir en el diccionario (que está iterando a través de una copia de las llaves, no las teclas en el diccionario sí, en este caso).

Otros consejos

Eliminar todas las claves cuyo valor es> 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]

Cambio:

for ansSeries in notmatched:

Para:

for ansSeries in notmatched.copy():
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top