Home > Blockchain >  Generate nested dictionary from pairs
Generate nested dictionary from pairs

Time:04-29

I have an input dictionary:

d={'AM-tv': 1.2,
  'AM-rs': 1.3,
  'AM-pq': 1.2,
  'BR-MN': 1.3,
  'BR-tN': 1.3,
  'BR-tq': 1.4}

Expected Output

d={'AM':{'tv':1.2,'rs':1.3,'pq':1.2},'BR':{'MN':1.3,'tN':1.3,'tq':1.4}

Is there any way to produce nested dictionary from pairs of the input dictionary?

CodePudding user response:

One way is to split the keys and use dict.setdefault to initialize inner dicts:

out = {}
for k,v in d.items():
    o,i = k.split('-')
    out.setdefault(o, {})[i] = v

Output:

{'AM': {'tv': 1.2, 'rs': 1.3, 'pq': 1.2},
 'BR': {'MN': 1.3, 'tN': 1.3, 'tq': 1.4}}

CodePudding user response:

You could loop over the items() which will give you key/value pairs, split() the key and assign. setdefault is helpful here to initialize the inner dicts with a new empty dict when it sees an outer key for the first time:

d = {
    'AM-tv': 1.2,
    'AM-rs': 1.3,
    'AM-pq': 1.2,
    'BR-MN': 1.3,
    'BR-tN': 1.3,
    'BR-tq': 1.4
}

new_d = {}

for k, v in d.items():
    k1, k2 = k.split('-')
    new_d.setdefault(k1, {})[k2] = v
    

new_d will be:

{'AM': {'tv': 1.2, 'rs': 1.3, 'pq': 1.2},
 'BR': {'MN': 1.3, 'tN': 1.3, 'tq': 1.4}}
  • Related