¿Cómo elimino entradas dentro de un objeto Counter con un bucle sin invocar un RuntimeError?

from collections import * ignore = ['the','a','if','in','it','of','or'] ArtofWarCounter = Counter(ArtofWarLIST) for word in ArtofWarCounter: if word in ignore: del ArtofWarCounter[word] 

ArtofWarCounter es un objeto Contador que contiene todas las palabras del Arte de la Guerra. Estoy intentando que las palabras en ignore eliminen del ArtofWarCounter.

Rastrear:

  File "", line 1, in  for word in ArtofWarCounter: RuntimeError: dictionary changed size during iteration 

Para cambios mínimos de código, use la list , de modo que el objeto sobre el que está iterando se desacople del Counter

 ignore = ['the','a','if','in','it','of','or'] ArtofWarCounter = Counter(ArtofWarLIST) for word in list(ArtofWarCounter): if word in ignore: del ArtofWarCounter[word] 

En Python2, puede usar ArtofWarCounter.keys() lugar de list(ArtofWarCounter) , pero cuando es tan simple escribir código que está a prueba de futuro, ¿por qué no hacerlo?

Es una mejor idea simplemente no contar los elementos que desea ignorar

 ignore = {'the','a','if','in','it','of','or'} ArtofWarCounter = Counter(x for x in ArtofWarLIST if x not in ignore) 

tenga en cuenta que hice ignore en un set que hace que la prueba x not in ignore mucho más eficiente

No recorra todas las palabras de un dict para encontrar una entrada, los dictados son mucho mejores en las búsquedas.

Recorre la lista de ignore y elimina las entradas que existen:

 ignore = ['the','a','if','in','it','of','or'] for word in ignore: if word in ArtofWarCounter: del ArtofWarCounter[word] 

Vea la siguiente pregunta para saber por qué su método actual no funciona:
Eliminar elementos de una lista mientras se está iterando

Básicamente, no debe agregar o eliminar elementos de una colección mientras realiza un bucle sobre ella. collections.Counter es una subclase de dict , consulte la siguiente advertencia en la documentación de dict.iteritems() :

El uso de iteritems() al agregar o eliminar entradas en el diccionario puede generar un RuntimeError o fallar en iterar sobre todas las entradas.

Use un contador, atraviese el bucle hacia atrás (de último a primero), retírelo según sea necesario. Bucle hasta cero.