15

ディクショナリ内のすべての大きな値とそのキーをポップアウトし、最小のものを保持したい。これが私のプログラムの一部です

for key,value in dictionary.items():
    for key1, value1 in dictionary.items(): 
            if key1!= key and value > value1:
                dictionary.pop(key)             
    print (dictionary)  

その結果、

RuntimeError: dictionary changed size during iteration    

このエラーを回避するにはどうすればよいですか?

4

9 に答える 9

14

Python3で、試してください

for key in list(dict.keys()):
    if condition:
        matched
        del dict[key]

キーを更新するために dict をループするときは、もう 1 つ注意が必要です。

コード 1:

keyPrefix = ‘keyA’
for key, value in Dict.items():
    newkey = ‘/’.join([keyPrefix, key])
    Dict[newkey] = Dict.pop(key)

コード 2:

keyPrefix = ‘keyA’
for key, value in Dict.keys():
    newkey = ‘/’.join([keyPrefix, key])
    Dict[newkey] = Dict.pop(key)

code1/code2 の結果は次のとおりです。

{‘keyA/keyA/keyB’ : ”, ‘keyA/keyA/keyA’: ”}

この予期しない結果を解決する私の方法:

    Dict = {‘/’.join([keyPrefix, key]): value for key, value in Dict.items()}

リンク: https://blog.gainskills.top/2016/07/21/loop-a-dict-to-update-key/

于 2015-09-23T06:38:17.880 に答える
6

copy.deepcopyを使用して元の辞書のコピーを作成し、元の辞書を変更しながらコピーをループできます。

from copy import deepcopy

d=dict()
for i in range(5):
    d[i]=str(i)

k=deepcopy(d)

d[2]="22"
print(k[2])
#The result will be 2.

あなたの問題は、あなたが変更しているものを繰り返すことです。

于 2012-11-22T21:02:49.590 に答える
2

ループ中にキーを記録し、ループが完了したら Dictionary.pop(key) を実行します。このような:

for key,value in dictionary.items():
    for key1, value1 in dictionary.items(): 
            if key1!= key and value > value1:
                storedvalue = key
    dictionary.pop(key)  
于 2012-11-22T20:37:49.297 に答える
0

最小値のキーだけを保持したい場合は、最初にそのアイテムを見つけてから、それだけを含む新しい辞書を作成します。辞書がだった場合d、次のようなものが1行でそれを行います。

d = dict((min(d.items(), key=lambda item: item[1]),))

これにより、反復中に辞書を更新する際の問題が回避されるだけでなく、他のすべての要素を削除するよりもおそらく高速になります。

何らかの理由でインプレースで変更を行う必要がある場合は、辞書を変更する前にすべてのキーのコピーが作成されるため、次のように機能します。

key_to_keep = min(d.items(), key=lambda item: item[1])[0]

for key in list(d):
    if key != key_to_keep:
        d.pop(key)
于 2012-11-22T21:09:36.977 に答える
0

私が今あなたのループを読んでいるように、あなたは最小の要素を 1 つだけ保持しようとしていますが、min. したがって、コードが現在行っていることとは逆のことを行い、チェックする場合 value1 < minValueSoFarは、key1 を minKeySoFar として保持します。次に、ループの最後で(Zayatzzが提案したように)、次のことを行いますdictionary.pop(minKeySoFar)

余談ですがkey1!=key、かなり長いリストを想定すると、テストは無関係であり、計算効率が悪いことに注意してください。

minValueSoFar = 9999999;   # or whatever
for key,value in dictionary.items():
    if value < minValueSoFar:
        minValueSoFar = value
        minKeySoFar = key
dictionary.pop(minKeySoFar)   # or whatever else you want to do with the result
于 2012-11-22T20:48:00.763 に答える