Given a dictionary, replace None values in every nesting with an empty dictionary.
Input : test_dict = {“Gfg” : {1 : None, 7 : None}, “is” : None, “Best” : [1, { 5 : None }, 9, 3]}
Output : {‘Gfg’: {1: {}, 7: {}}, ‘is’: {}, ‘Best’: [1, {5: {}}, 9, 3]}
Explanation : All None values are replaced by empty dictionaries.Input : test_dict = {“Gfg” : {7 : None}, “is” : None, “Best” : [1, { 5 : None }, 9, 3]}
Output : {‘Gfg’: {7: {}}, ‘is’: {}, ‘Best’: [1, {5: {}}, 9, 3]}
Explanation : All None values are replaced by empty dictionaries.
Method : Using recursion + isinstance()
In this, we check for dictionary instance using isinstance() and call for recursion for nested dictionary replacements. This also checks for nested instances in form of list elements and checks for the list using isinstance().
# Python3 code to demonstrate working of # Replace None with Empty Dictionary # Using recursion + isinstance() # helper function to perform task def replace_none(test_dict):
# checking for dictionary and replacing if None
if isinstance (test_dict, dict ):
for key in test_dict:
if test_dict[key] is None :
test_dict[key] = {}
else :
replace_none(test_dict[key])
# checking for list, and testing for each value
elif isinstance (test_dict, list ):
for val in test_dict:
replace_none(val)
# initializing dictionary test_dict = { "Gfg" : { 1 : None , 7 : 4 }, "is" : None ,
"Best" : [ 1 , { 5 : None }, 9 , 3 ]}
# printing original dictionary print ( "The original dictionary is : " + str (test_dict))
# calling helper fnc replace_none(test_dict) # printing result print ( "The converted dictionary : " + str (test_dict))
|
Output:
The original dictionary is : {‘Gfg’: {1: None, 7: 4}, ‘is’: None, ‘Best’: [1, {5: None}, 9, 3]} The converted dictionary : {‘Gfg’: {1: {}, 7: 4}, ‘is’: {}, ‘Best’: [1, {5: {}}, 9, 3]}
Method 2: Using stack
Step-by-step approach:
- Start by creating an empty stack and push the input dictionary onto it.
- While the stack is not empty, pop the top item from the stack.
- If the popped item is a dictionary, loop through its key-value pairs:
a. If the value is None, replace it with an empty dictionary.
b. If the value is a dictionary or a list, push it onto the stack.
If the popped item is a list, loop through its elements:
a. If the element is None, replace it with an empty dictionary.
b. If the element is a dictionary or a list, push it onto the stack. - Repeat steps 2-4 until the stack is empty.
- Return the modified dictionary.
Below is the implementation of the above approach:
def replace_none(test_dict):
# Create a stack with the initial dictionary
stack = [test_dict]
# While the stack is not empty, process the dictionaries in the stack
while stack:
cur_dict = stack.pop()
# If the current item in the stack is a dictionary, process its key-value pairs
if isinstance (cur_dict, dict ):
for key, val in cur_dict.items():
# If the value is None, replace it with an empty dictionary
if val is None :
cur_dict[key] = {}
# If the value is a dictionary or a list, push it onto the stack
elif isinstance (val, ( dict , list )):
stack.append(val)
# If the current item in the stack is a list, process its elements
elif isinstance (cur_dict, list ):
for i, val in enumerate (cur_dict):
# If the value is None, replace it with an empty dictionary
if val is None :
cur_dict[i] = {}
# If the value is a dictionary or a list, push it onto the stack
elif isinstance (val, ( dict , list )):
stack.append(val)
# Example usage test_dict = { "Gfg" : { 1 : None , 7 : 4 }, "is" : None , "Best" : [ 1 , { 5 : None }, 9 , 3 ]}
replace_none(test_dict) print (test_dict)
|
{'Gfg': {1: {}, 7: 4}, 'is': {}, 'Best': [1, {5: {}}, 9, 3]}
Time complexity: O(n)
Auxiliary space: O(n)