将模拟树的dict转换为列表

2021-06-14 23:35:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一句话:

{
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条回答
网友
1楼 ·
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]]
网友
2楼 ·

Recursion:

def flatten(d, prefix=()):
    for k,v in d.items():
        if isinstance(v, dict):
            yield from flatten(v, prefix=prefix+(k,))
        else:
            yield list(prefix + (v,))

迭代:

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]

注意:在Python中使用递归比较容易破坏堆栈。如果您的数据很大,即比sys.getrecursionlimit()更深,那么您应该更喜欢广度优先的解决方案—这可能会消耗大量内存,但不会stack overflow。你知道吗

相关问题