栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用列表中的项目更改嵌套字典的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}]


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/610537.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号