Python:从键、值对列表创建任意嵌套的字典
我试图从Python中的键、值对列表中创建任意嵌套的字典。键值对列表如下所示:Python:从键、值对列表创建任意嵌套的字典,python,algorithm,dictionary,recursion,Python,Algorithm,Dictionary,Recursion,我试图从Python中的键、值对列表中创建任意嵌套的字典。键值对列表如下所示: input_data = [{1:2}, {2:3}, {3:4}, {3:5}, {1:3}] [我的实际输入数据要大得多,递归性也要大得多。]考虑到该输入,我们的目标是嵌套所有键值对,以便实现: {1: {2: {3: {4: null}, {5: null}}}, {3: {4: null, 5: null} } } 我一直在修补一些递归函数,但仍然没有取得突破。如果其他人的想法有助于解决此类嵌套问题,我将
input_data = [{1:2}, {2:3}, {3:4}, {3:5}, {1:3}]
[我的实际输入数据要大得多,递归性也要大得多。]考虑到该输入,我们的目标是嵌套所有键值对,以便实现:
{1: {2: {3: {4: null}, {5: null}}}, {3: {4: null, 5: null} } }
我一直在修补一些递归函数,但仍然没有取得突破。如果其他人的想法有助于解决此类嵌套问题,我将非常感谢他们的建议。您可以通过两个步骤完成此操作,首先将边列表转换为节点到连接节点的图形:
In []:
graph = {}
for edge in inpt:
for n1, n2 in edge.items():
graph.setdefault(n1, []).append(n2)
graph
Out[]
{1: [2, 3], 2: [3], 3: [4, 5]}
注意:不要使用input
作为变量名,它会隐藏python的内置input()
然后,创建一个递归函数来获取您要查找的路径相当容易,下面是一个递归函数,它获取一个图和起始节点,并返回该节点的路径:
In []:
def paths(graph, nodes):
if not nodes:
return None
return {node: paths(graph, graph.get(node, [])) for node in nodes}
paths(graph, [1])
Out[]
{1: {2: {3: {4: None, 5: None}}, 3: {4: None, 5: None}}}
注意:预期的输出不是有效的字典
或者,您可以使用队列迭代执行此操作:
In []:
def paths(graph, start):
p = {}
q = [(start, p, set())]
while q:
node, c, visited = q.pop()
if node not in graph or node in visited:
c[node] = None
continue
visited = visited | {node}
for n in graph[node]:
q.append((n, c.setdefault(node, {}), visited))
return p
paths(graph, 1)
Out[]:
{1: {2: {3: {4: None, 5: None}}, 3: {4: None, 5: None}}}
注意:这需要一个有向非循环图,否则它将递归,直到python失败——这需要额外的检查来避免。您能提供更多的上下文吗?这些数据来自何处?用输入构建一个图表:每个键值对代表一条边。图形的DFS遍历是您想要的输出。@PauloScardine I生成了数据,并可以根据需要对其进行重塑。这些数据在运行时都是可用的,它描述了一系列定向的教师->学生关系,但是是循环的@_ÓscarLópez我认为这是一条道路。当我醒来时,我会尝试一下。谢谢@AChampion,这很有帮助。图是有方向的循环图[悬停边,最终会找到循环]:。你的代码有没有修改可以处理图的循环性质?传递或保留一组访问的节点,并包括对该组的检查,我已经更新了但没有测试迭代解决方案。真是太棒了。非常感谢。