#python
Вопрос:
Мне нужно проверить, существует ли ключ в словаре Python, и значение этого не равно null/пусто для нескольких ключей, прежде чем продолжить обработку.
exception = False if 'key1' in d and d['key1']: pass else: exception = True if 'key2' in d and d['key2']: pass else: exception = True if 'key3' in d and d['key3']: pass else: exception = True if not exception: #Process it
Я чувствую, что этот код очень уродлив и не является питоническим.
Можем ли мы написать логику лучше?
Комментарии:
1.
if d.get('keyX'):
? Вы также можете объединить несколько проверок сany
илиall
.2. Ваша
exception
переменная всегда истинна. Все ваши «если» бессмысленны.
Ответ №1:
Вы можете использовать all
и генератор:
if all(k in d and d[k] for k in ['key1', 'key2', 'key3']): pass else: exception = True
Вы действительно можете пропустить использование флага:
if not all(k in d and d[k] for k in ['key1', 'key2', 'key3']): # process
или
if any(k not in d or not d[k] for k in ['key1', 'key2', 'key3']): # process
Ответ №2:
Вы можете использовать d.get(k)
:
if all( d.get(k) for k in ["key1","key2","key3"]): exception = False else: exception = True
или
exception = all( d.get(k) for k in ["key1","key2","key3"])
Комментарии:
1. хорошее использование get 😉 1
Ответ №3:
Вы можете использовать try/except
с operator.itemgetter
или использовать dict.get
:
from operator import itemgetter try: exception = not all(itemgetter('key1', 'key2', 'key3')(d)) except KeyError: exception = True
Или,
exception = not all(map(d.get, ('key1', 'key2', 'key3')))
Комментарии:
1. Мне нравится второй 😉 1
Ответ №4:
Это должно дать вам правильный Bool.
exception = False for k in ['key1', 'key2', 'key3']: if k in d and d[k]: exception = True break
Ответ №5:
Ответ @mozway более питонический и лучший, но в любом случае здесь используется другой подход с использованием функции.
def check_dict(dictionary): for key, value in dictionary.items(): if key not in ("key1", "key2", "key3"): return False return True