fjjones88
fjjones88

Reputation: 349

Dynamically Iterating Through a Python Dictionary

I have a dictionary that looks like:

my_dict = {
   'A': 'update_me',
   'B': {
       'C': 'D',
       'E': 'F'
   },
   'G': {
       'H': 'update_me',
       'I': 'J',
       'K': 'update_me'
   }
}

I'm trying to create a function that will loop through every key value pair and determine if that value is update_me. If it is, it will set that value equal to this_worked. So it'd look like this:

my_dict = {
   'A': 'this_worked',
   'B': {
       'C': 'D',
       'E': 'F'
   },
   'G': {
       'H': 'this_worked',
       'I': 'J',
       'K': 'this_worked'
   }
}

In addition to this, I would like this to be dynamic, so that the code doesn't have to explicitly look for my_dict['A'] or my_dict['G']['H']. It should just loop through each key value pair, and if that value is update_me, then update it (I have other dictionaries that I need to update in a similar way, but their keys, lengths and depths are varying).

I think I really just need a way to loop through every level of a dictionary that has any number of particular levels.

Upvotes: 0

Views: 612

Answers (3)

You can achieve this by this

my_dict = {
   'A': 'update_me',
   'B': {
       'C': 'D',
       'E': 'F'
   },
   'G': {
       'H': 'update_me',
       'I': 'J',
       'K': 'update_me'
   }
}

old_value = "update_me"
new_value = "new_value"

def replace_value(my_dict, old_value, new_value):
    for key, value in my_dict.items():
        if type(value) is dict:
            replace_value(value, old_value, new_value)
        elif value == old_value:
            my_dict[key] = new_value
    return my_dict
        

my_dict = replace_value(my_dict, old_value, new_value)
print(my_dict)

# {'A': 'new_value', 'B': {'C': 'D', 'E': 'F'}, 'G': {'H': 'new_value', 'I': 'J', 'K': 'new_value'}}

Upvotes: 0

nikeros
nikeros

Reputation: 3379

A solution could be:

def replace(my_dict, old_test="update_me", new_text="this_worked"):
    for x, y in my_dict.items():
        if type(y) is dict:
            replace(y)
        elif type(y) is str:
            if y == old_text:
                y = new_text
            my_dict[x] = y
    return my_dict

Upvotes: 0

Samwise
Samwise

Reputation: 71454

An easy way to handle operations with arbitrary levels of nesting is a recursive function. In this case, you want to perform an operation on each item in a dictionary, and do that same thing for each item that is itself a dictionary:

>>> def recursive_replace(d, old, new):
...     if d == old:
...         return new
...     if not isinstance(d, dict):
...         return d
...     return {k: recursive_replace(v, old, new) for k, v in d.items()}
...
>>> recursive_replace(my_dict, "update_me", "this_worked")
{'A': 'this_worked', 'B': {'C': 'D', 'E': 'F'}, 'G': {'H': 'this_worked', 'I': 'J', 'K': 'this_worked'}}

Upvotes: 2

Related Questions