'Creating a new key with values within a sub dictionary of a dictionary

I have a dictionary:

my_dictionary = {'Kyle': {'benz':2, 'ford':1, 'bmw':5, 'gmc':6, 'subaru':3}
              'Jim': {'benz':5, 'ford':9, 'bmw':3, 'gmc':1, 'subaru':2}
              'Tom': {'benz':3, 'ford':4, 'bmw':8, 'gmc':2, 'subaru':10}
              'Eric: {'benz':6, 'ford':7, 'bmw':9, 'gmc':5, 'subaru':3}
             }

My objective is to create a new key called: 'german_cars'

Which takes the sum of the keys 'bmw' and 'benz'.

I want to have the newly created key 'german_cars' within my_dictionary like this:

my_dictionary = {'Kyle': {'benz':2, 'ford':1, 'bmw':5, 'gmc':6, 'subaru':3, 'german_cars':7}
              'Jim': {'benz':5, 'ford':9, 'bmw':3, 'gmc':1, 'subaru':2, 'german_cars':8}
              'Tom': {'benz':3, 'ford':4, 'bmw':8, 'gmc':2, 'subaru':10, 'german_cars':11}
              'Eric: {'benz':6, 'ford':7, 'bmw':9, 'gmc':5, 'subaru':3, 'german_cars':15}
             }

I would like to know an automated way of doing this using for loops.



Solution 1:[1]

my_dict = {'Kyle': {'benz':2, 'ford':1, 'bmw':5, 'gmc':6, 'subaru':3},
              'Jim': {'benz':5, 'ford':9, 'bmw':3, 'gmc':1, 'subaru':2},
              'Tom': {'benz':3, 'ford':4, 'bmw':8, 'gmc':2, 'subaru':10},
              'Eric': {'benz':6, 'ford':7, 'bmw':9, 'gmc':5, 'subaru':3}
             }
for k,v in my_dict.items():
    v['german_cars'] = v['bmw']+v['benz']

you can also dictionary comprehensions like this

{k:v.update({'german_cars':v['bmw']+v['benz']}) for k,v in my_dict.items()} 

both yield the same result.

print my_dict

results in

{'Eric': {'benz': 6,
          'bmw': 9,
          'ford': 7,
          'german_cars': 15,
          'gmc': 5,
          'subaru': 3},
 'Jim': {'benz': 5,
         'bmw': 3,
         'ford': 9,
         'german_cars': 8,
         'gmc': 1,
         'subaru': 2},
 'Kyle': {'benz': 2,
          'bmw': 5,
          'ford': 1,
          'german_cars': 7,
          'gmc': 6,
          'subaru': 3},
 'Tom': {'benz': 3,
         'bmw': 8,
         'ford': 4,
         'german_cars': 11,
         'gmc': 2,
         'subaru': 10}}

Solution 2:[2]

You can loop over the outer dictionary and then modify the inner dicts directly:

for owner, cars in my_dictionary.items():
    cars['german_cars'] = cars.get('bmw', 0) + cars.get('benz', 0)

FWIW, I used dict.get() so the lookups would not fail if either "bmw" or "benz" was missing.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 Raymond Hettinger