【发布时间】:2015-07-20 01:35:41
【问题描述】:
我有一个类似的字符串
foo/bar/baz
例如,我也有val=1。有没有一种干净的方法可以将foo/bar/baz 拆分为多维字典,其中字典中的最后一项等于 1。所以它看起来像
{'foo': {'bar': {'baz': 1}}}
【问题讨论】:
标签: python string dictionary
我有一个类似的字符串
foo/bar/baz
例如,我也有val=1。有没有一种干净的方法可以将foo/bar/baz 拆分为多维字典,其中字典中的最后一项等于 1。所以它看起来像
{'foo': {'bar': {'baz': 1}}}
【问题讨论】:
标签: python string dictionary
>>> 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}}}
【讨论】:
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
【讨论】: