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


问题内容

我有一个像

foo/bar/baz

我也有val=1例如。有没有一种干净的方法可以将foo/bar/bazdiv分解为多维dict,而dict中的最后一项等于1。所以它看起来像

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

问题答案:

您可以像这样使用reducereversed功能

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

如果您使用的是Python
3.x,则需要reducefunctools

>>> 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}}}