Как проверить, содержит ли словарь определенные ключи

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

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

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

спасибо.

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

5 ответов


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

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

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

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

if all(test in d for test in ('a','b','c')):
    # do something

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

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

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

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

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


можно использовать itemgetter, завернутый в try / except.

>>> 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'

но на самом деле я предпочитаю решение пола Макгира


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

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

замена logging.warn вызов по мере необходимости, конечно (может быть, просто logging.info или даже лесозаготовки.отладка может лесозаготовки.ошибка, возможно, исключение).

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