に対する解決策です。RuntimeError: 巡回辞書操作時に反復処理中に辞書サイズが変更された。
社員情報の追加、削除、チェックの業務を行っているときに、ユーザーの入力IDでユーザー情報を削除する要件がありました。ファイルからユーザー情報を抽出し、ユーザーIDをキー、その他ユーザーに関する情報を値とする辞書に格納しました。辞書をループしているときに、ユーザーIDが辞書のキーと等しくなると、情報が削除され、RuntimeError: dictionary changed size during iterationというエラーとともに削除が報告されます。
for key in staff_info:
if user_id == key:
print(key)
staff_info.pop(key)
id_exist = True
参考:https://www.python.org/dev/peps/pep-0234/#dictionary-iterators
で公式サイトの解説をご覧ください。
辞書は tp_iter このスロットは、辞書のキーに対して反復処理を行う効率的なイテレータを返します。このような反復の間、辞書は修正されてはいけません。ただし、既存のキーに対する値の設定は許可されます(削除や追加は許可されません。 update() メソッド)。つまり、次のように書くことができる。
for k in dict: ...
と同等であるが、より高速である。
for k in dict.keys(): ...
ただし、(ループや他のスレッドによる)辞書の修正に関する制限に違反しない限りである。
すでに存在するキーに値をセットする場合を除き、ループしている間は複数の辞書を削除したり更新したりできない、ということです。 と for k in dict.keys(): ... 効果は同じですが、前者の方が高速です。
では、テストしてみましょう。
a = {'a': 1, 'b': 0, 'c': 1, 'd': 0}
for key in a:
print(key, a[key])
for key in a.keys():
print(key, a[key])
# Both loops have the same effect
print(a.keys()) # dict_keys(['a', 'b', 'c', 'd'])
print(a) # {'a': 1, 'b': 0, 'c': 1, 'd': 0}
a.keysがdict_keys型であることを除けば、これらは同じ効果を持ちます。
すると、リスト形式への変換はOKという解答が出てきました。
for key in list(staff_info.keys()):
if user_id == key:
print(key)
staff_info.pop(key)
id_exist = True
関連
-
[解決済み】pkg_resources という名前のモジュールがありません。
-
[解決済み】TKinterでボタンを無効にする/有効にする
-
[解決済み] TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'」を修正するにはどうしたらいいですか?
-
[解決済み] シンプルオーディオで音楽再生を停止する方法
-
[解決済み] tensorflow:AttributeError: 'module' オブジェクトに 'mul' 属性がない。
-
[解決済み] Project Euler #3 with python - MOST EFFICIENT METHOD [クローズド].
-
[解決済み] Pythonはコンピュータの中でどのように文字列を保存しているのですか?
-
[解決済み] Scipyにおける'frozen distribution'の意味とは?
-
[解決済み] 改行までのtqdm印刷
-
[解決済み] ユーザー登録でエラー:そのようなテーブルがない:auth_user
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
(解決済み) ValueError: 連結軸を除く全ての入力配列の次元が正確に一致する必要がある_walking_quantization-programmer_ITS203
-
[解決済み] Pythonの円形リストイテレータ
-
[解決済み] UnicodeDecodeError: 'ascii' コーデックはポジション 1 のバイト 0xef をデコードできません。
-
[解決済み] _csv.reader' オブジェクトは添え字を付けることができません。
-
[解決済み] PythonでGenerics/templates?
-
[解決済み] ソースディレクトリとビルドディレクトリを分離する」とはどういう意味ですか?
-
[解決済み] 2つの数値の比を計算する関数を書く
-
[解決済み] 動画(ディスク)をrtspストリームに変換する方法
-
ModuleNotFoundErrorの解決策です。tensorflow.contrib'という名前のモジュールがありません。
-
TypeError: - でサポートされていないオペランド型: 'int' および 'list' プロシージャ