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
# Python3 code to demonstrate working of
# Swapping Hierarchy in Nested Dictionaries
# Using loop + items()
# initializing dictionary
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]}}
# printing original dictionary
print("The original dictionary : " + str(test_dict))
# Swapping Hierarchy in Nested Dictionaries
# Using loop + items()
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
# printing result
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
# Python3 code to demonstrate working of
# Swapping Hierarchy in Nested Dictionaries
# Using defaultdict() + loop
from collections import defaultdict
# initializing dictionary
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]}}
# printing original dictionary
print("The original dictionary : " + str(test_dict))
# Swapping Hierarchy in Nested Dictionaries
# Using defaultdict() + loop
res = defaultdict(dict)
for key, val in test_dict.items():
for key_in, val_in in val.items():
res[key_in][key] = val_in
# printing result
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) # {'a': {'Gfg': [1, 3, 7, 8]}, 'b': {'Gfg': [4, 9]}, 'c': {'Gfg': [0, 7]}}
test_dict2 = {'Gfg': {'best': [1, 3, 4]}}
output2 = swap_hierarchy(test_dict2)
print(output2) # {'best': {'Gfg': [1, 3, 4]}}
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)
Similar Reads
Python - Group Hierarchy Splits of keys in Dictionary
Given a dictionary with keys joined by a split character, the task is to write a Python program to turn the dictionary into nested and grouped dictionaries. Examples Input: test_dict = {"1-3" : 2, "1-8" : 10}, splt_chr = "-"Output: {'1': {'3': 2, '8': 10}}Explanation : 1 is linked to 3 with value 2
5 min read
Python - Inversion in nested dictionary
Given a nested dictionary, perform inversion of keys, i.e innermost nested becomes outermost and vice-versa. Input : test_dict = {"a" : {"b" : {}}, "d" : {"e" : {}}, "f" : {"g" : {}} Output : {'b': {'a': {}}, 'e': {'d': {}}, 'g': {'f': {}} Explanation : Nested dictionaries inverted as outer dictiona
3 min read
Python - Unnest single Key Nested Dictionary List
Sometimes, while working with Python data, we can have a problem in which we need to perform unnesting of all the dictionaries which have single nesting of keys, i.e a single key and value and can easily be pointed to outer key directly. This kind of problem is common in domains requiring data optim
6 min read
Create Nested Dictionary using given List - Python
The task of creating a nested dictionary in Python involves pairing the elements of a list with the key-value pairs from a dictionary. Each key from the list will map to a dictionary containing a corresponding key-value pair from the original dictionary. For example, given the dictionary a = {'Gfg':
3 min read
Python | Difference in keys of two dictionaries
In this article, we will be given two dictionaries dic1 and dic2 which may contain the same keys and we have to find the difference of keys in the given dictionaries using Python. Example Input: dict1= {'key1':'Geeks', 'key2':'For', 'key3':'geeks'}, dict2= {'key1':'Geeks', 'key2':'Portal'} Output: k
5 min read
Python - Removing Nested None Dictionaries
Sometimes, while working with Records, we can have a problem in which we need to perform the removal of nested records from the dictionary which are empty. This can have application in data preprocessing. Lets discuss certain ways in which this task can be performed. Method #1 : Using dict() + filte
4 min read
Parsing Json Nested Dictionary Using Python
We are given a JSON string and we have to parse a nested dictionary from it using different approaches in Python. In this article, we will see how we can parse nested dictionary from a JSON object using Python. Example: Input: json_data = '{"name": "John", "age": 30, "address": {"city": "New York",
2 min read
Python - Sorted Nested Keys in Dictionary
Sometimes, while working with Python dictionaries, we can have a problem in which we need to extract all the keys of nested dictionaries and render them in sorted order. This kind of application can occur in domains in which we work with data. Lets discuss certain ways in which this task can be perf
4 min read
Python | Sort nested dictionary by key
Sorting has quite vivid applications and sometimes, we might come up with a problem in which we need to sort the nested dictionary by the nested key. This type of application is popular in web development as JSON format is quite popular. Let's discuss certain ways in which this can be performed. Met
4 min read
Filter List of Python Dictionaries by Key in Python
In Python, filtering a list of dictionaries based on a specific key is a common task when working with structured data. In this article, weâll explore different ways to filter a list of dictionaries by key from the most efficient to the least.Using List Comprehension List comprehension is a concise
3 min read