Python – Swapping Hierarchy in Nested Dictionaries
Last Updated :
27 Apr, 2023
Sometimes, while working with Python dictionaries, we can have a problem in which we need to perform hierarchy swapping of nested dictionaries. This problem can have application in domains which require dictionary restructuring. Let’s discuss certain ways in which this task can be performed.
Input : test_dict = {‘Gfg’: { ‘a’ : [1, 3, 7, 8], ‘b’ : [4, 9], ‘c’ : [0, 7]}}
Output : {‘c’: {‘Gfg’: [0, 7]}, ‘b’: {‘Gfg’: [4, 9]}, ‘a’: {‘Gfg’: [1, 3, 7, 8]}}
Input : test_dict = {‘Gfg’: {‘best’ : [1, 3, 4]}}
Output : {‘best’: {‘Gfg’: [1, 3, 4]}}
Method #1 : Using loop + items()
The combination of above functions can be used to solve this problem. In this, we iterate the dictionary and restructure using brute force. The items() is used to extract all the key-value pairs of dictionary.
Python3
test_dict = { 'Gfg' : { 'a' : [ 1 , 3 ], 'b' : [ 3 , 6 ], 'c' : [ 6 , 7 , 8 ]},
'Best' : { 'a' : [ 7 , 9 ], 'b' : [ 5 , 3 , 2 ], 'd' : [ 0 , 1 , 0 ]}}
print ( "The original dictionary : " + str (test_dict))
res = dict ()
for key, val in test_dict.items():
for key_in, val_in in val.items():
if key_in not in res:
temp = dict ()
else :
temp = res[key_in]
temp[key] = val_in
res[key_in] = temp
print ( "The rearranged dictionary : " + str (res))
|
Output :
The original dictionary : {‘Gfg’: {‘a’: [1, 3], ‘c’: [6, 7, 8], ‘b’: [3, 6]}, ‘Best’: {‘d’: [0, 1, 0], ‘a’: [7, 9], ‘b’: [5, 3, 2]}}
The rearranged dictionary : {‘d’: {‘Best’: [0, 1, 0]}, ‘a’: {‘Gfg’: [1, 3], ‘Best’: [7, 9]}, ‘c’: {‘Gfg’: [6, 7, 8]}, ‘b’: {‘Gfg’: [3, 6], ‘Best’: [5, 3, 2]}}
Time Complexity: O(n*n), where n is the length of the list test_dict
Auxiliary Space: O(n) additional space of size n is created where n is the number of elements in the res list
Method #2 : Using defaultdict() + loop
This is yet another brute force way to solve this problem. In this, we reduce a key test step by using defaultdict() rather than conventional dictionary.
Python3
from collections import defaultdict
test_dict = { 'Gfg' : { 'a' : [ 1 , 3 ], 'b' : [ 3 , 6 ], 'c' : [ 6 , 7 , 8 ]},
'Best' : { 'a' : [ 7 , 9 ], 'b' : [ 5 , 3 , 2 ], 'd' : [ 0 , 1 , 0 ]}}
print ( "The original dictionary : " + str (test_dict))
res = defaultdict( dict )
for key, val in test_dict.items():
for key_in, val_in in val.items():
res[key_in][key] = val_in
print ( "The rearranged dictionary : " + str ( dict (res)))
|
Output :
The original dictionary : {‘Gfg’: {‘a’: [1, 3], ‘c’: [6, 7, 8], ‘b’: [3, 6]}, ‘Best’: {‘d’: [0, 1, 0], ‘a’: [7, 9], ‘b’: [5, 3, 2]}}
The rearranged dictionary : {‘d’: {‘Best’: [0, 1, 0]}, ‘a’: {‘Gfg’: [1, 3], ‘Best’: [7, 9]}, ‘c’: {‘Gfg’: [6, 7, 8]}, ‘b’: {‘Gfg’: [3, 6], ‘Best’: [5, 3, 2]}}
Using zip and dict:
Approach:
Define a function swap_hierarchy() that takes a dictionary as input.
Initialize a new empty dictionary new_dict.
For each key2 in the nested dictionary accessed by test_dict[next(iter(test_dict))]:
a. Create a new key in new_dict with value key2.
b. Assign to the value of the new key a dictionary comprehension that swaps the keys and values of test_dict such that the value of each new key is the value of the original key2 in the nested dictionary of the corresponding original key1 in test_dict.
Return the new_dict.
Test the function with example inputs and print the output.
Python3
def swap_hierarchy(test_dict):
new_dict = {key2: {key1: test_dict[key1][key2] for key1 in test_dict} for key2 in test_dict[ next ( iter (test_dict))]}
return new_dict
test_dict1 = { 'Gfg' : { 'a' : [ 1 , 3 , 7 , 8 ], 'b' : [ 4 , 9 ], 'c' : [ 0 , 7 ]}}
output1 = swap_hierarchy(test_dict1)
print (output1)
test_dict2 = { 'Gfg' : { 'best' : [ 1 , 3 , 4 ]}}
output2 = swap_hierarchy(test_dict2)
print (output2)
|
Output
{'a': {'Gfg': [1, 3, 7, 8]}, 'b': {'Gfg': [4, 9]}, 'c': {'Gfg': [0, 7]}}
{'best': {'Gfg': [1, 3, 4]}}
Time Complexity: O(n)
Auxiliary Space: O(n)
Please Login to comment...