なぜ電話しなければならないのですかitems()
辞書内のキーと値のペアを反復処理するにはどうすればいいでしょうか?
dic = {'one': '1', 'two': '2'}
for k, v in dic.items():
print(k, v)
なぜそれが辞書を反復処理するデフォルトの動作ではないのか
for k, v in dic:
print(k, v)
ベストアンサー1
すべての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
キー/値のペアを取得するために使用する「適切な」メソッドの元のスペルであることに注意してください。残念ながら、これは、そのようなアクセサがリスト全体を返していた時代のことなので、「単なる反復」をサポートするために別のスペルを導入する必要がありました。iteritems
そして、以前の Python バージョンとの下位互換性の制約が大幅に弱まった Python 3 では、items
再び別のスペルが導入されました。)