我想使用新密钥c
更新字典k_new
的密钥。即使我提到不同的堆栈溢出问题,如this,它也不会更新。请告诉我哪里弄错了。
from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
c = {'apples': 3, 'biscuits and tea': 3, 'oranges and onions': 4}
for k in c:
splits=k.split()
k_new= " ".join(lemmatizer.lemmatize(w.lower()) for w in splits)
c[k_new] = c.pop(k)
print(c)
PS:我也用过:
c[k_new] = c[k]
del c[k]
然后我得到RuntimeError: dictionary changed size during iteration
请帮帮我
答案 0 :(得分:2)
在迭代时更新字典:
SELECT
在迭代时更新集合通常是一个非常糟糕的主意。大多数数据结构都不是为处理这个问题而设计的。
然而,你可以构建一个新词典:
from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
c = {'apples': 3, 'biscuits and tea': 3, 'oranges and onions': 4}
for k in c: # iterate over c
splits=k.split()
k_new= " ".join(lemmatizer.lemmatize(w.lower()) for w in splits)
c[k_new] = c.pop(k) # update (two times) c
print(c)
我们可以通过使用字典理解来使这更加优雅:
from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
c = {'apples': 3, 'biscuits and tea': 3, 'oranges and onions': 4}
c_new = {}
for k in c:
splits=k.split()
k_new= " ".join(lemmatizer.lemmatize(w.lower()) for w in splits)
c_new[k_new] = c[k]
print(c_new)
这个单行构建一个新词典,我们迭代{" ".join(lemmatizer.lemmatize(w.lower()) for w in k.split()): v
for k,v in c.items()}
的键值对k,v
,并添加一个与值{{1}相关联的键c
}。
答案 1 :(得分:2)
在字典更改时对字典进行迭代可能会产生效果,因为您正在使用对键的实时引用。只需从关键视图中列出一个列表,它就会起作用:
for k in list(c):
...