I have a dictionary, like this:
myDict = {"a":{"a":{"a":8, "b":4, "c":5}, "b":{"a":0, "b":2, "c":1}, "c":{"a":3, "b":9, "c":6}}}
and I have a list (with multiple element, it can be so much):
myKeys = ["a", "c", "b"]
and my problem is, that I want to make a function that change the value of the dictionary:
def ValKeys(mDict, mKeys, mValue):
#some code...
#it do that:
mDict[mKeys[0]][mKeys[1]][mKeys[2]]...[mKeys[len(mKeys)]] = mValue
return mDict
for example in this case, it returns:
myDict = ValKeys(myDict, myKeys, 7) #=> myDict["a"]["c"]["b"] = 7 (instead of 9)
CodePudding user response:
I guess the biggest problem is that you don't know the length of mKeys
, but you can use a loop to access nested dict
:
def ValKeys(mDict, mKeys, mValue):
tmp_dict = mDict
for k in mKeys[:-1]: # notice we stop before last key
tmp_dict = tmp_dict[k]
# now tmp_dict is the reference for the most nested dict, we can just assign value
tmp_dict[mKeys[-1]] = mValue
mDict = {"a": {"b": 1}}
mKeys = ["a", "b"]
ValKeys(mDict, mKeys, 5)
print(mDict) # {"a": {"b": 5}}
And the same with more pythonic approach:
import functools
def ValKeys(mDict, mKeys, mValue):
nested = functools.reduce(lambda d, x: d[x], mKeys[:-1], mDict)
nested[mKeys[-1]] = mValue