2017-10-04 9 views
4

私の辞書cのキーを新しいキーk_newで更新したいと思います。私はthisのような異なるスタックオーバーフローの問題を参照していますが、更新されません。私が間違っている場所を教えてください。Pythonのループで辞書キーを更新する

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

を取得し、あなたがそれを反復しながら、あなたは辞書を更新してくれ

+1

お取置きは...辞書を更新しない... –

+1

関連:https://stackoverflow.com/questions/ 1207406/remove-items-while-iteratingのリスト –

答えて

2

を助けてください:

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,vcに繰り返し、値に関連付けるキー" ".join(lemmatizer.lemmatize(w.lower()) for w in k.split())を追加します。

+0

彼は 'c'の代わりに' c.items() 'を反復するだけです... – thebjorn

+0

@thebjorn:はい。それが私がリストの理解の中で行うことです:私は修正を提案しますが、それを行うためのもっと優雅な方法を示すことを目指します。 –

+0

両方のソリューションで新しいdictsが作成されますが、OPが 'c.items()'を反復した場合(つまり、キーを保持する別のデータ構造を作成した場合) )。個人的に私はこの場合、ディクテーションの理解度はあまりにも複雑だと思う(そして ':v'はほとんど消える)が、おそらくもっと味の問題だ。 – thebjorn

2

変更中の辞書を反復すると、キーのリアルタイム参照を使用しているため、効果が得られない可能性があります。ただ、キービューのうち、リストを作り、それが動作します:あなたはそれを反復しながら、

for k in list(c): 
    ... 
+0

答えをありがとう。しかし、キーを変更しながらキーに割り当てられた値も取得したい。私たちはリストでそれをすることができますか? –

関連する問題