3

我有一个复杂的问题,我似乎无法深入了解。我有一个与 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']

在我的实际问题中,我需要通过字典跟踪键列表并更改结束位置的值。如何动态完成(使用循环等)?

谢谢您的帮助!:)

4

5 回答 5

4

使用reduceoperator.getitem

>>> from operator import getitem
>>> lis = ['car', 'ford', 'mustang']

更新值:

>>> reduce(getitem, lis[:-1], DictOfVehiclePrices)[lis[-1]] = 'cheap'

取值:

>>> reduce(getitem, lis, DictOfVehiclePrices)
'cheap'

请注意,在 Python 3reduce中已移至functools模块。

于 2013-11-12T07:41:59.507 回答
1

一个非常简单的方法是:

DictOfVehiclePrices[listOfKeys[0]][listOfKeys[1]][listOfKeys[2]] = 'new value'
于 2013-11-12T07:41:26.300 回答
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'}}
于 2013-11-12T07:43:14.157 回答
0

@Joel Cornett在这里有一个很好的解决方案。

基于Joel方法,您可以像这样使用它:

def set_value(dict_nested, address_list):
    cur = dict_nested
    for path_item in address_list[:-2]:
        try:
            cur = cur[path_item]
        except KeyError:
            cur = cur[path_item] = {}
    cur[address_list[-2]] = address_list[-1]

DictOfVehiclePrices = {'car':
                      {'ford':
                          {'mustang': 'expensive',
                           'other': 'cheap'},
                       'toyota':
                          {'big': 'moderate',
                           'small': 'cheap'}
                      },
                   'truck':
                      {'big': 'expensive',
                       'small': 'moderate'}
                  }

set_value(DictOfVehiclePrices,['car', 'ford', 'mustang', 'a'])

print DictOfVehiclePrices
  • 标准输出:

{'car': {'toyota': {'small': 'cheap', 'big': 'moderate'}, 'ford': {'mustang': 'a', 'other': 'cheap'}} ,“卡车”:{“小”:“中等”,“大”:“昂贵”}}

于 2013-11-12T07:53:20.220 回答
-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函数需要的params

2.该函数将迭代键列表,并从字典中检索值。

3.如果检索到的值是dict,它会从列表中弹出键,并用键的值更新dict。

4.将更新的字典和键列表递归地发送到相同的函数。

5.当列表为空时,这意味着我们已经到达了所需的密钥,我们需要在其中应用我们的替换。因此,如果列表为空,该函数将 dict[key] 替换为值

于 2019-01-08T12:50:11.860 回答