1. ホーム
  2. python

[解決済み] Pythonで辞書を反復処理するときに、なぜ.items()を呼び出す必要があるのでしょうか?

2022-06-30 12:01:41

質問

なぜ items() を呼び出して、辞書のキーと値のペアを繰り返し処理する必要があるのでしょうか? すなわち、以下のようになります。

dic = {'one': '1', 'two': '2'}
for k, v in dic.items():
    print(k, v)

辞書を反復処理する際のデフォルトの動作はなぜそうなっていないのでしょうか?

for k, v in dic:
    print(k, v)

どのように解決するのですか?

すべてのpythonコンテナCについて、期待されるのは

for item in C:
    assert item in C

は問題なく通過します。 あなた の一つの感覚が in (が、もう一方(存在チェック)と全く違う意味を持っていたら、驚くと思いますか?) 私はそう思います。 リスト、セット、タプル、...については当然そのように動作します。

では C が辞書である場合 in でキー/値のタプルを生成していたとします。 for のループで、それならば、最小驚嘆の原則によって in はそのようなタプルを左側のオペランドとして含むかどうかをチェックしなければならないでしょう。

それはどのように役に立つのでしょうか? かなり無駄です。基本的に if (key, value) in C の同義語である if C.get(key) == value -- の100倍の頻度で行っている、あるいは行いたいと思っているチェックです。 if k in C 実際に というのは キーがあるかどうかを確認することです。 のみ のみをチェックし、値は完全に無視します。

一方、キーだけでループさせたいことはよくあることで、例えば

for k in thedict:
    thedict[k] += 1

のように値も持っていても、特に役には立たないでしょう。

for k, v in thedict.items():
    thedict[k] = v + 1

は、実際にはやや分かりにくく、簡潔ではありません。 (ただし items は、キーと値のペアを取得するために使用するメソッドのオリジナルの綴りです。残念ながら、それはそのようなアクセサがリスト全体を返していた時代にさかのぼり、quot;単なる反復処理をサポートするために、別の綴りを導入する必要がありました。 iteritems であった -- Python 3 では、以前の Python バージョンとの後方互換性の制約がかなり弱くなったので、それは items に戻りました)。