410

同じエラーで他のすべての質問を確認しましたが、役立つ解決策は見つかりませんでした =/

リストの辞書があります:

d = {'a': [1], 'b': [1, 2], 'c': [], 'd':[]}

一部の値が空です。これらのリストを作成した後、辞書を返す前にこれらの空のリストを削除したいと考えています。現在、私は次のようにこれをやろうとしています:

for i in d:
    if not d[i]:
        d.pop(i)

ただし、これにより実行時エラーが発生します。辞書の反復処理中に要素を追加/削除できないことは承知しています...その場合、これを回避する方法は何でしょうか?

4

12 に答える 12

655

Python 3.x および 2.x では、 useを使用listしてキーのコピーを強制的に作成できます。

for i in list(d):

Python 2.x では、呼び出しkeysによってキーのコピーが作成され、次の変更中に反復処理できますdict

for i in d.keys():

ただし、Python 3.x では、キーをリストにコピーする代わりにビュー オブジェクトkeysを返すため、この 2 番目の方法はエラーの解決に役立たないことに注意してください。

于 2012-08-13T20:33:21.450 に答える
61

辞書内包表記を使用して、関連する項目を新しい辞書にコピーするだけです

>>> d
{'a': [1], 'c': [], 'b': [1, 2], 'd': []}
>>> d = { k : v for k,v in d.iteritems() if v}
>>> d
{'a': [1], 'b': [1, 2]}

これはPython 3で

>>> d
{'a': [1], 'c': [], 'b': [1, 2], 'd': []}
>>> d = { k : v for k,v in d.items() if v}
>>> d
{'a': [1], 'b': [1, 2]}
于 2012-08-13T20:38:00.337 に答える
13

そもそも空のリストを挿入しないようにしますが、一般的には次のように使用します。

d = {k: v for k,v in d.iteritems() if v} # re-bind to non-empty

2.7 より前の場合:

d = dict( (k, v) for k,v in d.iteritems() if v )

あるいは単に:

empty_key_vals = list(k for k in k,v in d.iteritems() if v)
for k in empty_key_vals:
    del[k]
于 2012-08-13T20:42:10.400 に答える