質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

11021閲覧

RuntimeError: dictionary changed size during iteration

k0908

総合スコア102

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2018/08/02 02:49

for key,value in dct.items(): if len(value) != 10: dct = dct.pop(key)

とコードを書いて、dct辞書のバリューの長さが10ではないものを削除するコードを書きました。このコードを実行すると、
RuntimeError: dictionary changed size during iteration
とエラーが出ました。

for key,value in list(dct): if len(value) != 10:    dct.pop(key)

とコードを書くと別のエラーが出て、

for key in list(dct):    dct.pop(key)

だとエラーは出ませんが、バリューの長さが10であるものを検出できません。

どのように修正すればいいでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ループ中に要素を増減させるのが良くないのです。
新しく条件を満たす辞書を作り直し、再代入すれば良いです。

Python

1dct = {k: v for k, v in dct.items() if len(v) != 10}

内包表記を使いたくないなら、こんな感じで書けます。

Python

1tmp = {} 2for key, value in dct.items(): 3 if len(value) != 10: 4 tmp[key] = value 5 6dct = tmp

投稿2018/08/02 03:05

LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

dct.items()をリストにしておくとできます。

python

1>>> dct = {10:"a"*10, 20:"a"*20} 2>>> for k,v in list(dct.items()): 3... if len(v) != 10: 4... dct.pop(k) 5... 6'aaaaaaaaaaaaaaaaaaaa' 7>>> dct 8{10: 'aaaaaaaaaa'}

投稿2018/08/02 03:07

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k0908

2018/08/02 04:06

ありがとうございます。わかりやすかったのでベストアンサーにさせていただきます!
unknown_user

2019/11/29 09:29 編集

このままでも十分よいですが、`list(dct.items())`で別のオブジェクトを生成してるのが肝だと思うので`{**dct}.items()`の方が直感的かなと思いました。
hayataka2049

2019/11/29 10:02 編集

等価ですが、可読性の観点からすると、dct.copy().items()の方が好ましいかもしれません。またそうする場合、ハッシュテーブルをまるごとコピーする非効率さも気にならなくはありません。
unknown_user

2019/11/30 05:47

なるほど勉強になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問