#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