在python中循环更新字典键

时间:2017-10-04 08:24:14

标签: python dictionary

我想使用新密钥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

请帮帮我

2 个答案:

答案 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):
    ...