如何将字符串拆分并形成多级嵌套字典?

10

我有一个类似的字符串

foo/bar/baz

比如说,我也有一个val=1。有没有一种简单的方法将foo/bar/baz拆分成多维字典,其中字典的最后一个项目等于1。它应该是这个样子的:

{'foo': {'bar': {'baz': 1}}}
2个回答

12
你可以使用 reducereversed 函数来实现,如下所示。
>>> reduce(lambda res, cur: {cur: res}, reversed("foo/bar/baz".split("/")), 1)
{'foo': {'bar': {'baz': 1}}}

如果您正在使用Python 3.x,则需要从functools导入reduce

>>> from functools import reduce
>>> reduce(lambda res, cur: {cur: res}, reversed("foo/bar/baz".split("/")), 1)
{'foo': {'bar': {'baz': 1}}}

在这里,reduce 的最后一个参数是起始值。它将从传递的可迭代对象中逐个获取值,使用结果和当前值调用函数,然后从下一次开始,上一次的结果将成为第一个参数,当前值将成为第二个参数。当可迭代对象用尽时,它将返回结果。

因此,执行过程会按照以下步骤进行:

假设 func 是 lambda 函数,它会重复地被调用,就像这样:

func(1, "baz")                   => {"baz": 1}
func({"baz": 1}, "bar")          => {"bar": {"baz": 1}}
func({"bar": {"baz": 1}}, "foo") => {"foo": {"bar": {"baz": 1}}}

2
d = 1
for part in reversed(s.split('/')):
    d = {part: d}

如果需要扩展此功能以创建类似目录树的东西,您可能需要基于defaultdict的解决方案:

import collections

def tree():
    return collections.defaultdict(tree)

def parsetree(path_strings):
    t = tree()
    for s in path_strings:
        temp = t
        parts = s.split('/')
        for part in parts[:-1]:
            temp = temp[part]
        temp[parts[-1]] = 1
    return t

演示:

>>> t = parsetree([
...     'foo/bar/baz',
...     'foo/bar/bop',
...     'foo/spam'
... ])
>>> t['foo']['bar']['baz']
1
>>> t['foo']['spam']
1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接