Как проверить, содержит ли словарь определенные ключи - PullRequest
7 голосов
/ 05 августа 2010

Есть ли хороший способ проверить, содержит ли словарь несколько ключей?

Короткая версия:

d = {}
if 'a' in d and 'b' in d and 'c' in d:
    pass #do something

Спасибо.

Редактировать: я могу использовать только python2.4 -.-

Ответы [ 5 ]

21 голосов
/ 05 августа 2010

Вы можете использовать set.issubset(...), например так:

>>> d = {'a': 1, 'b': 2, 'c': 3}
>>> set(['a', 'b']).issubset(d)
True
>>> set(['a', 'x']).issubset(d)
False

В Python 3 введен синтаксис литерала набора, который был перенесен в Python 2.7, поэтому в наши дни можно написать следующее:

>>> d = {'a': 1, 'b': 2, 'c': 3}
>>> {'a', 'b'}.issubset(d)
True
>>> {'a', 'x'}.issubset(d)
False
20 голосов
/ 05 августа 2010
if all(test in d for test in ('a','b','c')):
    # do something
5 голосов
/ 05 августа 2010

В Python3 вы можете написать

set("abc")<=d.keys()

В Python2.7 вы можете написать

d.viewkeys()>=set("abc")

, конечно, если ключи не единичные символы, вы можете заменить set("abc") на set(('a', 'b', 'c'))

1 голос
/ 05 августа 2010

В версии 2.4 я всегда использую операции над множествами для таких целей.Если это стоит предупреждения (или другого вида сообщения или исключения), когда некоторые ожидаемые ключи отсутствуют, в частности, я делаю:

missing = set(d).difference(('a', 'b', 'c'))
if missing:
    logging.warn("Missing keys: %s", ', '.join(sorted(missing)))
else:
    ...

заменяя вызов logging.warn соответствующим образом, конечно (возможно, простоlogging.info или даже logging.debug, возможно, logging.error, может быть, исключение.

Часть sorted в основном косметическая (мне нравятся надежные, повторяющиеся сообщения об ошибках), но также помогает при тестировании (когда я тестирую logging.warn - или что-то еще - в тестах, приятно иметь возможность ожидать конкретную строку, и если я не отсортировал missing, строка предупреждения, конечно, может отличаться, так каксеты, как и у диктовок, не имеют понятия порядка).

1 голос
/ 05 августа 2010

Можно использовать элемент-элемент, завернутый в попытку / исключение.

>>> from operator import itemgetter
>>> d = dict(a=1,b=2,c=3,d=4)
>>> e = dict(a=1,b=2,c=3,e=4)
>>> getter=itemgetter('a','b','c','d')
>>> getter(d)
(1, 2, 3, 4)
>>> getter(e)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'd'

Но на самом деле я предпочитаю решение Пола МакГвайра

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...