将模拟树的字典转换为列表

时间:2017-11-10 03:34:23

标签: python python-2.7 list dictionary tree

我有这样的字典:

{
1: {
   3: {
      1: {c:32},
      2: {c:12}
      },
   4: {c: 66}
   },
2: {
   3: {c: 1},
   5: {c: 2}
   }
}

如何优雅地展开这棵树以获得:

[
[1, 3, 1, 32],
[1, 3, 2, 12],
[1, 4, 66],
[2, 3, 1],
[2, 5, 2]
]

这种结构可以任意深入。

编辑 - 我不关心输出的顺序。 ' C'是一个特定的整数序列被看到的次数。所以在这种情况下,[1,3,1]被看到了32次。

确切的格式并不重要,这是我所追求的技术。

2 个答案:

答案 0 :(得分:5)

Recursion:

from collections import deque

def flatten(d):
    queue = deque([[[], d]])
    while queue:
        prefix, node = queue.popleft()
        if isinstance(node, dict):
            queue.extend([(prefix + [k], v) for k, v in node.items()])
        else:
            yield prefix[:-1] + [node]

迭代:

sys.getrecursionlimit()

注意:使用Python中的递归来破坏堆栈相对容易。如果您的数据很大,即比{{1}}更深,那么您应该更喜欢广度优先解决方案 - 这可能会占用大量内存,但不会stack overflow

答案 1 :(得分:4)

def unroll(d):
    for k, v in d.items():
        if isinstance(v, dict):
            for l in unroll(v):
                yield [k] + l
        else:
                yield [v]

你称之为

list(unroll(d))

为了你的输入我得到了

[[1, 3, 1, 32], [1, 3, 2, 12], [1, 4, 66], [2, 3, 1], [2, 5, 2]]