将列表转换为嵌套字典

5 投票
6 回答
4065 浏览
提问于 2025-04-16 21:29

比如我有

x = ['a','b','c']

我需要把它转换成:

y['a']['b']['c'] = ''

这样可以吗?

背景是,我有一个配置文件,里面有点状表示法,它指向一些json数据中的某个地方。我想用这个点状表示法字符串来访问json文件中的特定数据。例如,在配置文件中:

path_to_data = "user.name.first_name"

我希望我的脚本能把它识别为:

json_data["user"]["name"]["first_name"]

这样我就可以获取first_name字段的值。我把原来的字符串转换成了一个列表,但现在我不知道怎么把它转换成一个嵌套字典。

编辑:我需要把这个字典应用到一个已有的数据结构上。假设:

m = {'a': {'b': {'c': 'lolcat'}}}

这样

m['a']['b']['c']

就能给我'lolcat'。如果我得到了正确的字典结构(就像一些回复所说的那样),我仍然需要把它应用到现有的字典'm'上。

所以,再次说明,我从配置文件中得到了这个:

c = 'a.b.c'

我把它转换成了一个列表,想着这样会更简单:

x = ['a','b','c']

现在我有一个类似json的数据结构:

m = {'a': {'b': {'c': 'lolcat'}}}

所以从'x'生成的嵌套字典应该能够遍历'm',这样

m['a']['b']['c']

就能让我得到猫咪。

6 个回答

1

在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或语言时。比如,有人可能会在使用某个库的时候,发现它的某些功能不太好用,或者在运行代码时出现错误。这种情况下,通常我们会去查找相关的资料,看看有没有人遇到过类似的问题,或者有没有解决方案。

StackOverflow是一个很好的地方,很多程序员会在这里分享他们的经验和解决方案。如果你在编程过程中遇到困难,可以在这个网站上搜索一下,看看有没有人问过类似的问题,或者直接发帖询问其他人。

记得在提问时,尽量把你的问题描述清楚,提供一些相关的代码和错误信息,这样其他人才能更好地理解你的问题,并给出帮助。

>>> x = ['a','b','c']
>>> y={}
>>> y[x[-1]]=""
>>> x.pop(-1)
'c'
>>> for i in x[::-1]:
...     y={i:y}
...
>>> y
{'a': {'b': {'c': ''}}}
>>> y['a']['b']['c']
''
4

我想你可能也想在最后加一个值。这个方法也可以做到:

def get_value(d, l):
    if len(l) > 1:
        return get_value(d[l[0]], l[1:])
    return d[l[0]]

def add_keys(d, l, c=None):
    if len(l) > 1:
        d[l[0]] = _d = {}
        d[l[0]] = d.get(l[0], {})
        add_keys(d[l[0]], l[1:], c)
    else:
        d[l[0]] = c

def main():
    d = {}
    l1 = ['a', 'b', 'c', 'd']
    c1 = 'letters'
    l2 = [42, "42", (42,)]
    c2 = 42
    add_keys(d, l1, c1)
    print d
    add_keys(d, l2, c2)
    print d

if __name__ == '__main__':
    main()

它会输出:

{'a': {'b': {'c': {'d': 'letters'}}}}
{'a': {'b': {'c': {'d': 'letters'}}}, 42: {'42': {(42,): 42}}}
letters
42

所以这个方法肯定有效。递归真是太棒了。

6
li = ['a','b','c']

d = reduce(lambda x, y: {y:x}, reversed(li+['']))

print(d)
print(d['a']['b']['c'])

当然可以!请把你想要翻译的内容发给我,我会帮你把它变得更简单易懂。

撰写回答