如何在不调用RuntimeError的情况下使用循环删除Counter对象中的条目?

Lou*_*s93 11 python collections containers counter

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]
Run Code Online (Sandbox Code Playgroud)

ArtofWarCounter是一个Counter对象,包含战争艺术中的所有单词.我正试图ignore从ArtofWarCounter 中删除单词.

追溯:

  File "<pyshell#10>", line 1, in <module>
    for word in ArtofWarCounter:
RuntimeError: dictionary changed size during iteration
Run Code Online (Sandbox Code Playgroud)

Joc*_*zel 15

不要遍历dict的所有单词来查找条目,dicts在查找时要好得多.

循环遍历ignore列表并删除存在的条目:

ignore = ['the','a','if','in','it','of','or']
for word in ignore:
    if word in ArtofWarCounter:
        del ArtofWarCounter[word]
Run Code Online (Sandbox Code Playgroud)


Joh*_*ooy 12

对于最小的代码更改,请使用list,以便您迭代的对象与之分离Counter

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

在Python2中,您可以使用ArtofWarCounter.keys()而不是list(ArtofWarCounter),但是当编写具有未来保护功能的代码时,为什么不这样做呢?

最好不要计算你想忽略的项目

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

请注意,我做ignore了一个set使测试x not in ignore更有效率的