Как проверить, содержит ли словарь определенные ключи
есть ли хороший подход, чтобы проверить, если словарь содержит несколько ключей?
краткая версия:
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
в 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 строка предупреждения может отличаться, конечно, так как наборы, как дикты,не имеют понятия порядка).