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

时间:2015-05-09 03:28:23

标签: python string dictionary

我有一个像

这样的字符串
foo/bar/baz

我也有val=1例如。是否有一种干净的方法将foo/bar/baz分割成多维dict,dict中的最后一项等于1.所以它看起来像

{'foo': {'bar': {'baz': 1}}}

2 个答案:

答案 0 :(得分:8)

您可以使用reducereversed功能,例如

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

如果您使用的是Python 3.x,则需要导入reduce from functools

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

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

因此,执行将逐步进行,如下所示

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

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

答案 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
相关问题