Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get values from many dictionaries by hierarchy

I have 4 dictionaries, let's call them:

dict1 , dict2 , dict3 , dict4

Example:

dict1 = {'A': 1, 'B':2}
dict2 = {'A': 3, 'C':4}
dict3 = {'B': 5, 'D':6}
dict4 = {'A': 7, 'B':8, 'C': 9, 'D':10, 'E':11}

Each dictionary level is "stronger" than those who come after it. As in, A found in dict1 will be 'stronger' than A found in dict2 in terms of precedence. Is there a short, elegant script to create a new dictionary, assembled from all four, where each key is taken from the "strongest" dictionary that contains that key?

The result should be: dict = {'A':1, 'B':2, 'C':4, 'D:6', 'E':11}

like image 914
Zusman Avatar asked Jan 01 '23 12:01

Zusman


1 Answers

I think the easiest/clearest approach here would be to create a new dictionary then use its update method, which overwrites existing keys. Something like this makes the precedence pretty obvious:

>>> x = {}
>>> x.update(dict4)
>>> x.update(dict3)
>>> x.update(dict2)
>>> x.update(dict1)
>>> x
{'A': 1, 'B': 2, 'C': 4, 'D': 6, 'E': 11}

Docs

You could of course make a utility of some sort for this, something like:

>>> def collapse(*dicts):
...     x = {}
...     for dict in dicts:
...         x.update(dict)
...     return x
...
>>>
>>> collapse(dict4, dict3, dict2, dict1)
{'A': 1, 'B': 2, 'C': 4, 'D': 6, 'E': 11}

(Though you'd need to remember to pass the dictionaries in the correct order.)

like image 72
chris Avatar answered Jan 11 '23 00:01

chris