Ваша петля
for key,value in d.items():
if key != '' and not isinstance(value, dict):
new_d[key] = value
elif key != '' and isinstance(value, dict):
new_d[key] = delete_empty_keys(value)
else:
pass
на самом деле просто проверяет, должен ли ключ быть пропущен, или , если это не так, как обрабатывать значение. Если вы извлекаете тест ключа в отдельный оператор if
, его можно переписать как
for key, value in d.items():
if key != '':
if not isinstance(value, dict):
new_d[key] = value
else:
new_d[key] = delete_empty_keys(value)
Таким образом, тест if key != '':
на самом деле фильтрует элементы, выбирая которые должны быть частью нового словаря. Фильтрация в понимании выполняется с помощью дополнительных if
компонентов в цикле:
<item> for <target> in <iterable> if <test> # optional: more for loops and if tests
Часть if <test>
фильтрует итерируемое, ограничивая используемые элементы. Используйте то же самое в словарном понимании.
Это оставляет внутренний if...else
тест, который можно выразить условным выражением (выбирая между двумя вариантами):
# iteration, for <target> in <iterable>
for key, value in d.items():
# filter, if <test>
if key != '':
# <item>, here a <key> and <value> expression for the dict comprehension
new_d[key] = value if not isinstance(value, dict) else delete_empty_keys(value)
Теперь у вас есть форма, которую можно превратить в словарь:
{
key: value if not isinstance(value, dict) else delete_empty_keys(value)
for key, value in d.items()
if key != ''
}
или, в вашей функции:
def delete_empty_keys(d):
return {key: value if not isinstance(value, dict) else delete_empty_keys(value)
for key, value in d.items() if key != ''}