Cómo evitar necesidad de actualizar un diccionario
-
23-08-2019 - |
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
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():