辞書を更新する必要を回避する方法
-
23-08-2019 - |
質問
私は、ループ内の辞書からK / Vのペアを削除する必要があります。 RuntimeError: dictionary changed size during iteration
を取得した後、私はK / Vを削除した後、私は新たに漬け/更新された辞書を再開しようと、外側ループの1つで辞書を漬け。しかし、あなたの多くは、おそらく知っている-Iはなり同じエラー-Iはそれがループの先頭に達したときに考えてもらいます。私は、最も外側のループで私の辞書を使用しないでください。
だから私の質問は、ないている誰もがこの問題を回避する方法を知っていますか?私は、ループの次の反復に辞書をリサイズ辞書や使用からK / Vのペアを削除したい。
問題が集中しCygilからの溶液を使用する
list=[27,29,23,30,3,5,40]
testDict={}
for x in range(25):
tempDict={}
tempDict['xsquared']=x*x
tempDict['xinverse']=1.0/(x+1.0)
testDict[(x,x+1)]=tempDict
for item in list:
print 'the Dictionary now has',len(testDict.keys()), ' keys'
for key in testDict.keys():
if key[0]==item:
del testDict[key]
私はいくつかの研究助手が原因で名前変異体の一致させることができなかった二つのデータセットから、いくつかの観測を比較していなければならないので、私はこれをやっています。アイデアは、キーマッチが他のデータセット(セットB)でそのキーに接続されたすべての名前を見つけるに基づいて、その後、1個のデータセット(Aセットと言う)から名前を投げるとすることです。一つの試合では、私は彼らのために物事をスピードアップするために、再度Bの値を表示したくない特定されています。 6000回の観測があるので、私はまた、彼らはAの初めに、彼らは仕事に戻るたびに開始する必要がありますする必要はありません。しかし、私は彼らが彼らが働いていたAから最後のキーを入力することを選んだせることでこれを修正することができます。マッチが識別された後しかし、私は本当にBを削減する必要があります。
解決
コードがなければ、私はあなたのような何かを書いていると仮定しています:
for key in dict:
if check_condition(dict[key]):
del dict[key]
もしそうなら、あなたが書くことができます。
for key in list(dict.keys()):
if key in dict and check_condition(dict[key]):
del dict[key]
list(dict.keys())
は、キーのコピーではなく辞書から削除することを可能にするビュー、返します(この場合は、キーではなく、辞書自体のキーのコピーを反復処理されます。)
他のヒント
、値が> 15であるすべてのキーを削除します。
for k in mydict.keys(): # makes a list of the keys and iterate
# over the list, not over the dict.
if mydict[k] > 15:
del mydict[k]
変更:
for ansSeries in notmatched:
宛先:
for ansSeries in notmatched.copy():