Update a Nested Dictionary in Python

In Python, dictionaries are versatile data structures that allow you to store and retrieve key-value pairs efficiently. Nested dictionaries provide a convenient way to organize and represent complex data. However, updating values within a nested dictionary can sometimes be challenging.

Direct Access Method

The simplest way to update a nested dictionary is by accessing the specific key using successive keys ?

nested_dict = {'outer_key': {'inner_key': 'old_value'}}
print("Before update:", nested_dict)

nested_dict['outer_key']['inner_key'] = 'new_value'
print("After update:", nested_dict)
Before update: {'outer_key': {'inner_key': 'old_value'}}
After update: {'outer_key': {'inner_key': 'new_value'}}

Using the update() Method

The update() method allows you to merge one dictionary into another, updating multiple values at once ?

nested_dict = {'outer_key': {'inner_key': 'old_value', 'another_key': 'old_data'}}
update_dict = {'inner_key': 'new_value', 'another_key': 'new_data'}

nested_dict['outer_key'].update(update_dict)
print(nested_dict)
{'outer_key': {'inner_key': 'new_value', 'another_key': 'new_data'}}

Recursive Update for Deep Nesting

For deeply nested dictionaries, a recursive function can traverse multiple levels ?

def update_nested_dict(nested_dict, keys, new_value):
    if len(keys) == 1:
        nested_dict[keys[0]] = new_value
    else:
        key = keys[0]
        if key in nested_dict:
            update_nested_dict(nested_dict[key], keys[1:], new_value)
        else:
            nested_dict[key] = {}
            update_nested_dict(nested_dict[key], keys[1:], new_value)

nested_dict = {'level1': {'level2': {'level3': 'old_value'}}}
keys = ['level1', 'level2', 'level3']
update_nested_dict(nested_dict, keys, 'updated_value')
print(nested_dict)
{'level1': {'level2': {'level3': 'updated_value'}}}

Handling Missing Keys

Using setdefault()

The setdefault() method creates keys if they don't exist ?

nested_dict = {'outer_key': {}}
nested_dict['outer_key'].setdefault('inner_key', 'default_value')
print(nested_dict)

# Try to set again - won't overwrite existing value
nested_dict['outer_key'].setdefault('inner_key', 'another_value')
print(nested_dict)
{'outer_key': {'inner_key': 'default_value'}}
{'outer_key': {'inner_key': 'default_value'}}

Using defaultdict

The defaultdict automatically creates missing keys ?

from collections import defaultdict

nested_dict = defaultdict(dict)
nested_dict['outer_key']['inner_key'] = 'new_value'
nested_dict['another_outer']['another_inner'] = 'another_value'
print(dict(nested_dict))
{'outer_key': {'inner_key': 'new_value'}, 'another_outer': {'another_inner': 'another_value'}}

Creating Immutable Copies

Use copy.deepcopy() to preserve the original dictionary while making updates ?

import copy

original_dict = {'outer_key': {'inner_key': 'old_value'}}
updated_dict = copy.deepcopy(original_dict)
updated_dict['outer_key']['inner_key'] = 'new_value'

print("Original:", original_dict)
print("Updated:", updated_dict)
Original: {'outer_key': {'inner_key': 'old_value'}}
Updated: {'outer_key': {'inner_key': 'new_value'}}

Comparison of Methods

Method Best For Handles Missing Keys
Direct Access Simple single updates No
update() Multiple key updates No
Recursive Function Deep nesting Yes (with modification)
setdefault() Creating missing keys Yes
defaultdict Automatic key creation Yes

Conclusion

Updating nested dictionaries in Python requires choosing the right approach based on your needs. Use direct access for simple updates, update() for multiple changes, and recursive functions for deep nesting. Handle missing keys with setdefault() or defaultdict.

Updated on: 2026-03-27T12:37:28+05:30

7K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements