foo/bar/baz
字符串我也有val=1
例如。有沒有乾淨的方式向foo/bar/baz
與最後一個項目拆分成一個多維字典在字典等於1,所以它看起來像
{'foo': {'bar': {'baz': 1}}}
foo/bar/baz
字符串我也有val=1
例如。有沒有乾淨的方式向foo/bar/baz
與最後一個項目拆分成一個多維字典在字典等於1,所以它看起來像
{'foo': {'bar': {'baz': 1}}}
>>> 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
是起始值。它將從傳遞的迭代中逐個取值,並用結果和當前值調用函數,然後在下一次向前時,最後的結果將是第一個參數,當前值將作爲第二個參數。當迭代器耗盡時,它將返回結果。
因此,執行會去,一步一步,如下
比方說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