1. ホーム
  2. プログラミング言語
  3. パイソン

反復解法と関連付けの間に変化した辞書のサイズ

2022-01-21 22:53:44
<パス

RuntimeError: 反復中に辞書のサイズが変更されました。

反復中に辞書の要素を変更することができないことを学習した

for k in my_dict.keys():
    if k in my_list:
        del my_dict[k]

  • 1
  • 2
  • 3

回避策:トラバーサル条件をリストに変更する

for k in list(my_dict.keys()):
    if k in my_list:
        del my_dict[k]

  • 1
  • 2
  • 3

のところです。

  • 辞書の要素の削除は del dict[key] を使用することもできます。
    dict.pop(key)
    list(my_dict.keys())
    
  • そして list(my_dict) は、どちらも辞書のキーのリストとなります。

このトラバーサルは、突然、関数型プログラミングの利点を思い起こさせた。
一例として

a = range(20)

for index, i in enumerate(a):
    if i % 3 ! = 0:
        a.pop(index)

[0, 2, 3, 5, 6, 8, 9, 11, 12, 14, 15, 17, 18]

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
a = range(20)
filter(lambda x: x % 3 == 0, a)

[0, 3, 6, 9, 12, 15, 18]

  • 1
  • 2
  • 3
  • 4

フィルター、マップ、リデュースのようなメソッドを使わない限り、トラバース中にイテレートしたオブジェクトを決して削除しないことを忘れないでください。