我有一个复杂的问题,我似乎无法深究。我有一个与Python字典中的位置对应的键列表。我希望能够动态更改位置的值(由列表中的键找到)。
例如:
listOfKeys = ['car', 'ford', 'mustang']
我也有一本字典:
DictOfVehiclePrices = {'car':
{'ford':
{'mustang': 'expensive',
'other': 'cheap'},
'toyota':
{'big': 'moderate',
'small': 'cheap'}
},
'truck':
{'big': 'expensive',
'small': 'moderate'}
}
通过我的列表,我如何动态更改DictOfVehiclePrices['car']['ford']['mustang']
?
在我的实际问题中,我需要通过字典按键列表并更改结束位置的值。如何动态完成(使用循环等)?
感谢您的帮助! :)
答案 0 :(得分:4)
>>> from operator import getitem
>>> lis = ['car', 'ford', 'mustang']
更新价值:
>>> reduce(getitem, lis[:-1], DictOfVehiclePrices)[lis[-1]] = 'cheap'
获取值:
>>> reduce(getitem, lis, DictOfVehiclePrices)
'cheap'
请注意,在Python 3中,reduce
已移至functools模块。
答案 1 :(得分:1)
一种非常简单的方法是:
DictOfVehiclePrices[listOfKeys[0]][listOfKeys[1]][listOfKeys[2]] = 'new value'
答案 2 :(得分:1)
print reduce(lambda x, y: x[y], listOfKeys, dictOfVehiclePrices)
<强>输出强>
expensive
为了更改值,
result = dictOfVehiclePrices
for key in listOfKeys[:-1]:
result = result[key]
result[listOfKeys[-1]] = "cheap"
print dictOfVehiclePrices
<强>输出强>
{'car': {'toyota': {'small': 'cheap', 'big': 'moderate'},
'ford': {'mustang': 'cheap', 'other': 'cheap'}},
'truck': {'small': 'moderate', 'big': 'expensive'}}
答案 3 :(得分:-1)
def update_dict(parent, data, value):
'''
To update the value in the data if the data
is a nested dictionary
:param parent: list of parents
:param data: data dict in which value to be updated
:param value: Value to be updated in data dict
:return:
'''
if parent:
if isinstance(data[parent[0]], dict):
update_dict(parent[1:], data[parent[0]], value)
else:
data[parent[0]] = value
parent = ["test", "address", "area", "street", "locality", "country"]
data = {
"first_name": "ttcLoReSaa",
"test": {
"address": {
"area": {
"street": {
"locality": {
"country": "india"
}
}
}
}
}
}
update_dict(parent, data, "IN")
这是一个递归函数,用于根据键列表更新嵌套字典:
1。使用必需的参数触发update dict函数
2。该函数将迭代键列表,并从字典中检索值。
3。如果检索到的值为dict,它将从列表中弹出键,并使用键的值更新dict。
4。将更新的字典和键列表递归发送到同一函数。
5。当列表为空时,表示我们已达到所需的密钥,需要在此处应用替换。因此,如果列表为空,则该功能将dict [key]替换为值