Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:从键、值对列表创建任意嵌套的字典_Python_Algorithm_Dictionary_Recursion - Fatal编程技术网

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} } } 我一直在修补一些递归函数,但仍然没有取得突破。如果其他人的想法有助于解决此类嵌套问题,我将

我试图从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} } }

我一直在修补一些递归函数,但仍然没有取得突破。如果其他人的想法有助于解决此类嵌套问题,我将非常感谢他们的建议。

您可以通过两个步骤完成此操作,首先将边列表转换为节点到连接节点的图形:

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,这很有帮助。图是有方向的循环图[悬停边,最终会找到循环]:。你的代码有没有修改可以处理图的循环性质?传递或保留一组访问的节点,并包括对该组的检查,我已经更新了但没有测试迭代解决方案。真是太棒了。非常感谢。