使用列表中的项目更改嵌套字典的dict的值?

使用列表中的项目更改嵌套字典的dict的值?,第1张

使用列表中的项目更改嵌套字典的dict的值?

单线

keys, (newkey, newvalue) = list_address[:-2], list_address[-2:]reduce(dict.__getitem__, keys, dict_nested)[newkey] = newvalue

注:

dict.get
operator.getitem
将在这里产生错误的异常。

乔尔·科内特(Joel
Cornett)的答案中
明确的for循环可能更具可读性。

如果要创建不存在的中间词典:

reduce(lambda d,k: d.setdefault(k, {}), keys, dict_nested)[newkey] = newvalue

如果要覆盖不是字典的现有中间值,例如字符串,整数:

from collections import MutableMappingdef set_value(d, keys, newkey, newvalue, default_factory=dict):    """    Equivalent to `reduce(dict.get, keys, d)[newkey] = newvalue`    if all `keys` exists and corresponding values are of correct type    """    for key in keys:        try: val = d[key]        except KeyError: val = d[key] = default_factory()        else: if not isinstance(val, MutableMapping):     val = d[key] = default_factory()        d = val    d[newkey] = newvalue
list_address = ["key1", "key1.2", "key1.2.1", "key1.2.1.1", "value"]dict_nested = {    "key1": {     "key1.1": {      "...": "...",     },     "key1.2": {      "key1.2.1": "change_this",     }, },    "key2": {     "...": "..." },}set_value(dict_nested, list_address[:-2], *list_address[-2:])assert reduce(dict.get, list_address[:-1], dict_nested) == list_address[-1]
测验
>>> from collections import OrderedDict>>> d = OrderedDict()>>> set_value(d, [], 'a', 1, OrderedDict) # non-existent key>>> d.items()[('a', 1)]>>> set_value(d, 'b', 'a', 2) # non-existent intermediate key>>> d.items()[('a', 1), ('b', {'a': 2})]>>> set_value(d, 'a', 'b', 3) # wrong intermediate type>>> d.items()[('a', {'b': 3}), ('b', {'a': 2})]>>> d = {}>>> set_value(d, 'abc', 'd', 4)>>> reduce(dict.get, 'abcd', d) == d['a']['b']['c']['d'] == 4True>>> from collections import defaultdict>>> autovivify = lambda: defaultdict(autovivify)>>> d = autovivify()>>> set_value(d, 'abc', 'd', 4)>>> reduce(dict.get, 'abcd', d) == d['a']['b']['c']['d'] == 4True>>> set_value(1, 'abc', 'd', 4) #doctest:+IGNORE_EXCEPTION_DETAILTraceback (most recent call last):...TypeError:>>> set_value([], 'abc', 'd', 4) #doctest:+IGNORE_EXCEPTION_DETAILTraceback (most recent call last):...TypeError:>>> L = [10]>>> set_value(L, [0], 2, 3)>>> L[{2: 3}]


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5616661.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存