He revisado todas las otras preguntas con el mismo error y aún no he encontrado una solución útil = /
Tengo un diccionario de listas:
d = {'a': [1], 'b': [1, 2], 'c': [], 'd':[]}
en el que algunos de los valores están vacíos. Al final de crear estas listas, quiero eliminar estas listas vacías antes de devolver mi diccionario. Actual Estoy intentando hacer esto de la siguiente manera:
for i in d:
if not d[i]:
d.pop(i)
Sin embargo, esto me está dando el error de tiempo de ejecución. Soy consciente de que no se pueden agregar / eliminar elementos en un diccionario mientras se itera a través de él ... ¿cuál sería una forma de evitar esto entonces?
fuente
keys
hace una copia de las claves que puede iterar sobre' también conocido como lasplural
claves ¿verdad? De lo contrario, ¿cómo se puede iterar sobre una sola tecla? Por cierto, no estoyfor i in d.keys()
realmente funciona en python 3.x en general , pero debido a que está iterando sobre una vista iterable de las teclas del diccionario, llamard.pop()
durante el ciclo conduce al mismo error que encontró.for i in list(d)
emula el comportamiento un poco ineficiente de python 2 de copiar las claves a una lista antes de iterar, para circunstancias especiales como la suya.list(d.keys())
crea la misma salida quelist(d)
, al llamarlist
adict
devuelve las claves. Lakeys
llamada (aunque no es tan cara) es innecesaria.Simplemente use la comprensión del diccionario para copiar los elementos relevantes en un nuevo dict
Para esto en Python 3
fuente
d.iteritems()
me dio un error Solíad.items()
lugar - utilizando python3Solo necesita usar "copiar":
De esa manera, usted itera sobre los campos del diccionario original y sobre la marcha puede cambiar el dict deseado (d dict). Funciona en cada versión de Python, por lo que es más claro.
fuente
Intentaría evitar insertar listas vacías en primer lugar, pero, en general, usaría:
Si es anterior a 2.7:
o solo:
fuente
Para Python 3:
fuente
No puede iterar a través de un diccionario mientras está cambiando durante el ciclo for. Hacer un casting para enumerar e iterar sobre esa lista, funciona para mí.
fuente
Para situaciones como esta, me gusta hacer una copia profunda y recorrer esa copia mientras modifico el dict original.
Si el campo de búsqueda está dentro de una lista, puede enumerar en el bucle for de la lista y luego especificar la posición como índice para acceder al campo en el dict original.
fuente
Esto funcionó para mí:
La conversión de los elementos del diccionario a la lista crea una lista de sus elementos, para que pueda iterar sobre ella y evitar el
RuntimeError
.fuente
dictc = {"stName": "asas"} keys = dictc.keys () para la clave en la lista (keys): dictc [key.upper ()] = 'Nuevo valor' print (str (dictc))
fuente
La razón del error de tiempo de ejecución es que no puede iterar a través de una estructura de datos mientras su estructura cambia durante la iteración.
Una forma de lograr lo que está buscando es usar la lista para agregar las claves que desea eliminar y luego usar la función pop en el diccionario para eliminar la clave identificada mientras recorre la lista.
fuente
Python 3 no permite la eliminación al iterar (usando para el bucle anterior) diccionario. Hay varias alternativas para hacer; una forma simple es cambiar la siguiente línea
Con
fuente