Access python nested dictionary items via a list of keys
Question: I have a complex dictionary structure which I would like to access via a list
of keys to address the correct item.

    
    
    dataDict = {
        "a":{
            "r": 1,
            "s": 2,
            "t": 3
            },
        "b":{
            "u": 1,
            "v": {
                "x": 1,
                "y": 2,
                "z": 3
            },
            "w": 3
            }
    }    
    
    maplist = ["a", "r"]
    

or

    
    
    maplist = ["b", "v", "y"]
    

I have made the following code which works but I'm sure there is a better and
more efficient way to do this if anyone has an idea.

    
    
    # Get a given data from a dictionary with position provided as a list
    def getFromDict(dataDict, mapList):    
        for k in mapList: dataDict = dataDict[k]
        return dataDict
    
    # Set a given data in a dictionary with position provided as a list
    def setInDict(dataDict, mapList, value): 
        for k in mapList[:-1]: dataDict = dataDict[k]
        dataDict[mapList[-1]] = value
    


Answer: Use `reduce()` to traverse the dictionary:

    
    
    def getFromDict(dataDict, mapList):
        return reduce(lambda d, k: d[k], mapList, dataDict)
    

and reuse `getFromDict` to find the location to store the value for
`setInDict()`:

    
    
    def setInDict(dataDict, mapList, value):
        getFromDict(dataDict, mapList[:-1])[mapList[-1]] = value
    

All but the last element in `mapList` is needed to find the 'parent'
dictionary to add the value to, then use the last element to set the value to
the right key.

Demo:

    
    
    >>> getFromDict(dataDict, ["a", "r"])
    1
    >>> getFromDict(dataDict, ["b", "v", "y"])
    2
    >>> setInDict(dataDict, ["b", "v", "w"], 4)
    >>> import pprint
    >>> pprint.pprint(dataDict)
    {'a': {'r': 1, 's': 2, 't': 3},
     'b': {'u': 1, 'v': {'w': 4, 'x': 1, 'y': 2, 'z': 3}, 'w': 3}}
    

