35

最近、次のようなコードを書きました。

# dct is a dictionary
if "key" in dct.keys():

ただし、後で同じ結果が得られることがわかりました。

if "key" in dct:

この発見は私に考えさせられ、辞書の方法を使用しなければならないシナリオがあるかどうかを確認するために、いくつかのテストを実行し始めました. keysしかし、私の結論はノーです。

リストにキーが必要な場合は、次のことができます。

keys_list = list(dct)

キーを繰り返し処理したい場合は、次のようにできます。

for key in dct:
    ...

最後に、キーが にあるかどうかをテストしたい場合は、上記のようにdct使用できますin

要約すると、私の質問は次のとおりです。何か不足していますか? メソッドを使用しなければならないシナリオはありkeysますか?...それとも、Python の以前のインストールから無視されるべき残りのメソッドですか?

4

4 に答える 4

30

Python 3 では、ディクショナリ ビュー オブジェクトdct.keys()を取得するために使用します。これにより、キーだけで操作を設定できます。

>>> for sharedkey in dct1.keys() & dct2.keys():  # intersection of two dictionaries
...     print(dct1[sharedkey], dct2[sharedkey])

Python 2.7 では、dct.viewkeys()そのために使用します。

Python 2 ではdct.keys()、辞書内のキーのコピーであるリストを返します。これは、ディクショナリ自体に影響を与えずに要素を削除するなど、それ自体で操作できる別のオブジェクトに渡すことができます。list(dct)ただし、 Python 2 と 3 の両方で機能する で同じリストを作成できます。

繰り返しやメンバーシップのテストには、これらのいずれも必要ありません。それらには常にfor key in dctkey in dctをそれぞれ使用します。

于 2013-07-13T21:15:04.010 に答える
13

ソース: PEP 234PEP 3106

Python 2 の比較的役に立たないdict.keysメソッドは、歴史的な理由から存在します。もともと、辞書は反復可能ではありませんでした。実際、反復子のようなものはありませんでした。要素アクセス メソッドであるを呼び出し__getitem__、 が発生するまで整数インデックスを増やして、シーケンスの反復処理を行いIndexErrorました。dict のキーを反復処理するには、keysメソッドを呼び出してキーの明示的なリストを取得し、それを反復処理する必要がありました。

イテレータが導入されたとき、dict はイテレータ可能になりました。

for key in d:

よりも

for key in d.keys()

d.keys()これには、まったく不要なものにするという副作用がありました。list(d)そしてiter(d)今、すべてd.keys()がよりクリーンでより一般的な方法で行われました。keysしかし、非常に多くのコードで既に呼び出されているため、を取り除くことはできませんでした。

(現時点では、 dicts にもメソッドがあったので、の代わりに__contains__言うことができます。これはより短く、 とうまく対称的でした。対称性は、dict を反復すると (key, value) ペアの代わりにキーが得られる理由でもあります。)key in dd.has_key(key)for key in d

Python 3 では、Java Collections Framework から着想を得て、dict のkeysvalues、およびitemsメソッドが変更されました。リストを返す代わりに、元の辞書のビューを返します。キー ビューとアイテム ビューはセットのような操作をサポートし、すべてのビューは基礎となる dict のラッパーであり、dict への変更を反映します。これがkeysまた重宝しました。

于 2013-07-13T22:21:31.600 に答える
2

Python 3 を使用していないと仮定すると、list(dct)dct.keys(). どちらを使用するかは、個人の好みの問題です。個人的にはもう少し明確だと思いますdct.keys()が、それぞれ独自のものです。

dct.keys()いずれにせよ、それ自体を使用する必要があるというシナリオはありません。

Python 3 では、「ディクショナリ ビュー オブジェクト」が返されるため、ループ コンテキストdct.keys()の外側でキー (巨大なディクショナリに役立つ可能性があります) への実体化されていないビューを保持する必要がある場合は、を使用する必要があります。fordct.keys()

于 2013-07-13T21:01:17.923 に答える