我有这样的字典:
{
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次。
确切的格式并不重要,这是我所追求的技术。
答案 0 :(得分:5)
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]]