树结构的路径名

时间:2013-07-02 11:19:09

标签: python tree

我有一个路径名列表:

www.example.com/a/b/c/d
www.example.com/a/b/e/f
www.example.com/a/c/d/f

我希望将其转换为字典:

a : {
  b : {
    c : {
      d : {}
    }
    e : {
      f : {}
    }
  c : {
    d : {
      f : {}
    }
  }
}

我写了非常天真的代码,但我希望自动化它,任何想法?

keys = paths.replace("www.example.com/", "").split("/")
test = {}

for key in keys:
    for i, k in enumerate(key):
        if i == 0:
            test.setdefault(k, {})
        if i == 1:
            test[key[0]].setdefault(k, {})
        if i == 2:
            test[key[0]][key[1]].setdefault(k, {})
        if i == 3:
            test[key[0]][key[1]][key[2]].setdefault(k, {})

2 个答案:

答案 0 :(得分:1)

我会给出一个解决方案来帮助你思考递归,如何合并多个路径的结果留给读者练习。

def fun(path):
    if len(path) == 0:
            return
    if len(path) == 1:
            return path[0]
    return {path[0]: fun(path[1:])}

path = "www.example.com/a/b/c/d".split("/")
d = fun(path)
print d

答案 1 :(得分:0)

这是经典的递归:

def add_nodes(root, nodes):
    if nodes:
        node = nodes.pop(0)
        root.setdefault(node, {})
        add_nodes(root[node], nodes)

示例:

>>> addresses = ['www.example.com/a/b/c/d', 'www.example.com/a/b/e/f', 'www.example.com/a/c/d/f']
>>> elts = [addr.split('/')[1:] for addr in addresses]
>>> tree = {}
>>> for elt in elts:
...     add_nodes(tree, elt)
... 
>>> tree
{'a': {'b': {'c': {'d': {}}, 'e': {'f': {}}}, 'c': {'d': {'f': {}}}}}