Проверка наличия ключа и значения в словаре python

#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