2015-05-09 63 views

回答

7

您可以使用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是起始值。它將從傳遞的迭代中逐個取值,並用結果和當前值調用函數,然後在下一次向前時,最後的結果將是第一個參數,當前值將作爲第二個參數。當迭代器耗盡時,它將返回結果。

因此,執行會去,一步一步,如下

比方說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