辞書でキーを検索しようとしましたが、keys()
関数を追加するのを忘れていました。それでも期待どおりの答えが得られました。
これら 2 つの式の結果が同じになるのはなぜでしょうか?
key in dict
そして
key in dict.keys()
ベストアンサー1
key in dct
なぜ同じ結果が返されるのかを理解するには、key in dct.keys()
過去を調べる必要があります。歴史的にPython 2では、鍵辞書dct
でdct.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 dct
key
がほぼ一定時間の操作でキーとして見つかった場合、trueを返します。dct
キーが2つであろうと100万個であろうと関係ありません。平均的なケースでは、その時間計算量は一定です(オー(1))
dct.keys()
Python 2ではlist
すべてのキーの を作成し、Python 3ではビューキーの集合。これらのオブジェクトは両方key in x
とも を理解します。Python 2では、任意の反復可能; 値は反復処理され、True
1 つの値が指定された値 (ここでは ) と等しくなるとすぐに が返されますkey
。
実際には、Python 2では、(キーの数key in dct.keys()
に比例して増加するため、計算時間はkey in dict
key in dct.keys()
の上)- both はdct.keys()
すべてのキーのリストを作成し、key in key_list
はの上))
Python 3では、はそれほどkey in dct.keys()
遅くなりません。key in dct
ビューキーのリストを作成しないので、アクセスは依然としてオー(1)ただし、実際には少なくとも一定値だけ遅くなり、文字数が 7 増えるため、Python 3 であっても、通常はこれを使用する理由はほとんどありません。