Help us understand the problem. What is going on with this article?

[Python]dictionary内にKeyが存在するか確認する方法

single key

Dictionary内にKeyが存在するか確認するときはinを使う。

下記のように key in dict.keys() 又は key in dictどちらでもよい。

In [2]: D = {'abc': 1, 'def': 2, 'ghi': 3, 'jkl' : 4}

In [3]: 'abc' in D.keys()
Out[3]: True

In [4]: 'xyz' in D.keys()
Out[4]: False

In [5]: 'abc' in D
Out[5]: True

ちなみに値が存在するかも同様にinを使うとよい

In [6]: 1 in D.values()
Out[6]: True

In [7]: 5 in D.values()
Out[7]: False

multiple keys

すべてのkeyが存在するか確認する方法

複数のkeyが存在するか確認するときはDictionary view objectを使う。python2.7とpython3系でDictonary view objectの取得方法が変わっている。python2.7の時はviewkeys()をpython3の時はkeys()を使う。

python2.7

python2.7
In [8]: D.viewkeys() >= {'abc', 'def'}
Out[8]: True

In [9]: D.viewkeys() >= {'abc', 'xyz'}
Out[9]: False

python3

python3 ではviewkeysがkeysになる。

In [3]: D.keys() >= {'abc', 'def'}
Out[3]: True

In [4]: D.keys() >= {'abc', 'xyz'}
Out[4]: False

両方で動くようにするにはsixを使って下記のように書く。

In [6]: import six

In [7]: six.viewkeys(D) >= {'abc', 'def'}
Out[7]: True

In [8]: six.viewkeys(D) >= {'abc', 'xyz'}
Out[8]: False

setを使う方法

@shiracamus さんからコメントで教えてもらった方法。こちらだとsixをimportする必要が無くすっきりしてます。

In [21]: set(D) >= {'abc', 'def'}
Out[21]: True

In [22]: set(D) >= {'abc', 'xyz'}
Out[22]: False

for loop & all を使う方法

@shiracamus さんからコメントで教えてもらった方法。

In [2]: all(key in D for key in ('abc', 'def'))
Out[2]: True

In [3]: all(key in D for key in ('abc', 'xyz'))
Out[3]: False

少なくとも一つkeyが存在するか確認する方法

dictionary view objectでは&を使ってintersectionが取れる。
https://docs.python.org/2/library/stdtypes.html#dictionary-view-objects

python2.7

In [14]: len(D.viewkeys() & {'abc', 'xyz'}) > 0
Out[14]: True

In [15]: len(D.viewkeys() & {'x', 'xyz'}) > 0
Out[15]: False

python3

In [10]: len(D.keys() & {'abc','xyz'}) > 0
Out[10]: True

In [11]: len(D.keys() & {'x','xyz'}) > 0
Out[11]: False

for loop & anyを使う方法

@shiracamus さんからコメントで教えてもらった方法。

In [25]: any(key in D for key in ('abc', 'xyz'))
Out[25]: True

In [26]: any(key in D for key in ('abc', 'def'))
Out[26]: True

In [27]: any(key in D for key in ('x', 'xyz'))
Out[27]: False

参考:
https://stackoverflow.com/questions/16004593/python-what-is-best-way-to-check-multiple-keys-exists-in-a-dictionary
https://docs.python.org/2/library/stdtypes.html#dictionary-view-objects

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away