как удалить вложенные словари, где все элементы внутри None - PullRequest
1 голос
/ 22 марта 2020

Например, у меня есть это вложенное dict:

nest_dic = {"dict_1":{"hello":"world", "python":"programming"}, "dict_2": {"tech":"geekbuzz", "OS":None}, "dict_3": {"fruit":None, "PRICE":None}}

Мне нужно получить:

new_dest_dic = {"dict_1":{"hello":"world", "python":"programming"}, "dict_2": {"tech":"geekbuzz", "OS":None}}

1 Ответ

1 голос
/ 22 марта 2020

Вы можете использовать any(), встроенный здесь, с Python пониманием словаря :

>>> {k: v1 for k, v1 in nest_dic.items() if any(v2 is not None for v2 in v1.values())}
{'dict_1': {'hello': 'world', 'python': 'programming'}, 'dict_2': {'tech': 'geekbuzz', 'OS': None}}

, в котором хранятся под-словари с любое значение, которое не None.

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

>>> {k: v1 for k, v1 in nest_dic.items() if not all(v2 is None for v2 in v1.values())}
{'dict_1': {'hello': 'world', 'python': 'programming'}, 'dict_2': {'tech': 'geekbuzz', 'OS': None}}

Который хранит Который хранит под-словари, в которых все не имеют значений None.

Также в качестве примечания для None сравнений из Рекомендации по программированию в PEP 8 :

Сравнения с синглетами, такими как None всегда следует делать с is или is not, но не с операторами равенства.

Также остерегайтесь писать if x, когда вы действительно имеете в виду if x is not None - например, при проверке переменной или аргумента по умолчанию Ни один не был установлен на какое-то другое значение. Другое значение может иметь тип (например, контейнер), который может быть ложным в логическом контексте!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...