Reputation: 2273
I have the following dict:
dict_2 = {
'key1': {'subkey1': 2, 'subkey2': 7, 'subkey3': 5},
'key2': {'subkey1': None, 'subkey2': None, 'subkey3': None},
}
I am looking forward to clean dict_2
from those None
values in the subkeys
, by removing the entire key with its nested dict:
In short my output should be:
dict_2={key1:{subkey1:2,subkey2:7,subkey3:5}}
What I tried was :
glob_dict={}
for k,v in dict_2.items():
dictionary={k: dict_2[k] for k in dict_2 if not None (dict_2[k]
['subkey2'])}
if bool(glob_dict)==False:
glob_dict=dictionary
else:
glob_dict={**glob_dict,**dictionary}
print(glob_dict)
My current output is :
TypeError: 'NoneType' object is not callable
I am not really sure if the loop is the best way to get rid of the None
values of the nested loop, and I am not sure either on how to express that I want to get rid of the None
values.
Upvotes: 2
Views: 2862
Reputation: 1
Easiest and simplest way to solve this problem
my_d = {'a':1,'b':None,'c':2,'d':{'e':None,'f':3}}
Code:
my_n_d = {}
my_n1_d = {}
for i , j in my_d.items():
if j is not None:
my_n_d[i] = j
if isinstance(j,dict):
for key in j:
if j[key] is not None:
my_n1_d[key] = j[key]
my_n_d[i] = my_n1_d
print(my_n_d)
output: {'a': 1, 'c': 2, 'd': {'f': 3}}
Upvotes: 0
Reputation: 1479
You can use a NestedDict
.
from ndicts.ndicts import NestedDict
dict_2 = {
'key1': {'subkey1': 2, 'subkey2': 7, 'subkey3': 5},
'key2': {'subkey1': None, 'subkey2': None, 'subkey3': None},
}
nd = NestedDict(dict_2)
nd_filtered = NestedDict()
for key, value in nd.items():
if value is not None:
nd_filtered[key] = value
To get the result as a dictionary
>>> nd_filtered.to_dict()
{'key1': {'subkey1': 2, 'subkey2': 7, 'subkey3': 5}}
To install ndicts pip install ndicts
Upvotes: 0
Reputation: 82785
dict_2={'key1':{'subkey1':2,'subkey2':7,'subkey3':5} ,'key2':{'subkey1':None,'subkey2':None,'subkey3':None}}
d = {}
for k, v in dict_2.iteritems():
if any(v.values()):
d[k] = v
print d
Result:
{'key1': {'subkey2': 7, 'subkey3': 5, 'subkey1': 2}}
Upvotes: 1
Reputation: 49812
A recursive solution to remove all None
, and subsequent empty dicts, can look this:
def remove_empties_from_dict(a_dict):
new_dict = {}
for k, v in a_dict.items():
if isinstance(v, dict):
v = remove_empties_from_dict(v)
if v is not None:
new_dict[k] = v
return new_dict or None
dict_2 = {
'key1': {'subkey1': 2, 'subkey2': 7, 'subkey3': 5},
'key2': {'subkey1': None, 'subkey2': None, 'subkey3': None},
}
print(remove_empties_from_dict(dict_2))
{'key1': {'subkey1': 2, 'subkey2': 7, 'subkey3': 5}}
Upvotes: 6