`key in dict` と `key in dict.keys()` の出力が同じになるのはなぜですか? 質問する

`key in dict` と `key in dict.keys()` の出力が同じになるのはなぜですか? 質問する

辞書でキーを検索しようとしましたが、keys()関数を追加するのを忘れていました。それでも期待どおりの答えが得られました。

これら 2 つの式の結果が同じになるのはなぜでしょうか?

key in dict

そして

key in dict.keys()

ベストアンサー1

key in dctなぜ同じ結果が返されるのかを理解するには、key in dct.keys()過去を調べる必要があります。歴史的にPython 2では、辞書dctdct.has_key(key)これは変更されましたPython 2.2、推奨される方法は となりkey in dct、基本的に同じことを行いました。

関連する小さな変更として、in演算子は辞書に対しても機能するようになったため、次key in dictの式と同等になりました。dict.has_key(key)

の動作はdunderメソッドinによって内部的に実装されています__contains__。その動作はPython 言語リファレンス - 3 データ モデル:

object.__contains__(self, item)

メンバーシップ テスト演算子を実装するために呼び出されます。項目が 内にある場合は true を返しself、それ以外の場合は false を返します。マッピング オブジェクトの場合、値やキーと項目のペアではなく、マッピングのキーを考慮する必要があります。を定義しないオブジェクトの場合__contains__()、メンバーシップ テストは最初に を介して反復を試行し__iter__()、次に を介して古いシーケンス反復プロトコルを試行し__getitem__()ます。言語リファレンスのこのセクションを参照してください。

(強調は私によるものです。Python の辞書はマッピング オブジェクトです)

Python3 について、このhas_key方法は完全に削除され、現在はキーの存在をテストする正しい方法はkey in dict、文書化されているように、 のみです。


上記2つとは対照的にkey in dct.keys()決して正しいことではない辞書にキーが存在するかどうかをテストする方法。両方の例の結果は確かに同じですが、key in dct.keys()Python 3 ではわずかに遅く、Python 2 ではひどく遅くなります。

key in dctkeyがほぼ一定時間の操作でキーとして見つかった場合、trueを返します。dctキーが2つであろうと100万個であろうと関係ありません。平均的なケースでは、その時間計算量は一定です(オー(1)

dct.keys()Python 2ではlistすべてのキーの を作成し、Python 3ではビューキーの集合。これらのオブジェクトは両方key in xとも を理解します。Python 2では、任意の反復可能; 値は反復処理され、True1 つの値が指定された値 (ここでは ) と等しくなるとすぐに が返されますkey

実際には、Python 2では、(キーの数key in dct.keys()に比例して増加するため、計算時間はkey in dictkey in dct.keys()の上)- both はdct.keys()すべてのキーのリストを作成し、key in key_listの上)

Python 3では、はそれほどkey in dct.keys()遅くなりません。key in dctビューキーのリストを作成しないので、アクセスは依然としてオー(1)ただし、実際には少なくとも一定値だけ遅くなり、文字数が 7 増えるため、Python 3 であっても、通常はこれを使用する理由はほとんどありません。

おすすめ記事