Как проверить, пуст ли КАКОЙ-либо ключ в dict? Питон

#python #dictionary #google-sheets

#python #словарь #google-sheets

Вопрос:

Я перебираю электронную таблицу (в частности, Google sheets), и она возвращает список словарей.

Я могу получить доступ к каждому dict с помощью …

 sheet = client.open('test').sheet1
list = sheet.get_all_records()
for row in list:
  

В каждом словаре мне нужно запустить функцию, которая проверяет, является ли определенный ключ пустым, если это так, то она возвращает тот словарь, который содержит пустой ключ. Я могу сделать это с помощью …

 for row in list:
   if bool(row['name']) == False:
      print(row)
  

Мой вопрос в том, как мне проверить, есть ли в КАКОМ-ЛИБО словаре пустой ключ ‘name’, если ни у одного dict нет пустого ключа ‘name’, запустите команду?

Надеюсь, это имело смысл.

Ответ №1:

Вы можете использовать any функцию для проверки всей коллекции:

 if any([bool(r['name']) == False for r in list]):
    print('at least one')
  

@Mad Physicist высказал хорошее замечание, которое стоит изучить.

В Python значения переменных могут быть преобразованы в логические и оцениваться на основе их «истинности». При использовании bool функции для преобразования значения, '' , None , 0 , и False все преобразуется в False . Любое другое значение преобразуется в True .

Такое же преобразование происходит при использовании not . bool(x)==False это то же самое, что not x

Имея это в виду, вы можете сделать код более кратким:

 if any([not r['name'] for r in list]):
    print('at least one')
  

Как также упоминалось @MP, вы можете изменить логику, используя all :

 if not all([r['name'] for r in list]):
    print('at least one')
  

all неявно преобразует каждое значение в логическое


Кстати, не используйте в list качестве имени переменной, поскольку это тип в Python.

Комментарии:

1. Вам не нужно явное bool , и тестирование == False также не является идиоматическим. Просто not r['name'] отлично.

2. Также, not all(r['name'] for r in ...)

3. Я ценю ответ и советы! Все, что может улучшить мой код, очень помогает.

Ответ №2:

Если я правильно понял, мне нравится

 empty = filter(
    lambda row: not row[“name”], 
    my_list
)

if len(empty):
  return empty

# do stuff