0

パス名のリストがあります:

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, {})
4

2 に答える 2

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
于 2013-07-02T11:45:43.717 に答える
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': {}}}}}
于 2013-07-02T11:53:07.310 に答える