在Python中引用值引用的字典

门诺·范·迪克(Menno Van Dijk)

python中是否有任何方法可以获取嵌套字典中值所属的键?

一个例子是:

dic = {1 : 
       {2 : 
        {3 : 4}},
       5 : 
       {6 :
        {7 : 8}}
      }

然后我想知道要到达4所需的路径8

这看起来像:

find_path(dic, 8)

应该返回类似

5, 6, 7 # since dic[5][6][7] leads to 8.

对于上下文:我正在尝试为60^5打算为游戏实现的AI创建游戏状态。我需要深入分析所有游戏状态,5以确定哪个最好。然后,为了到达深度5的状态,我需要知道在深度1、2、3和4采取什么步骤才能达到该游戏状态。我不知道词典是否最适合实现这一目标,因此,如果可能的话,我想听听其他建议。

达里尔

两种解决方案

第一-递归

第二-深度优先搜索

第一个解决方案-使用递归

def find_path(d, value, path = [], sol = []):
    for k, v in d.items():
        if isinstance(v, dict):
            path.append(k)
            find_path(v, value, path, sol)
            path.pop()
        elif v == value:
            path.append(k)
            sol.append(path[:])
            path.pop()
    return sol

dic = {1 : {2 : 
             {3 : 4}
            }, 
        5 : {6 :
             {7 : 8}}}

for v in range(10):
    found = find_path(dic, v, [], [])
    if found:
        print("{} -> {}".format(v, found[0))  # showing first solution
                                              # found will show them all
    else:
        print("No path to {}".format(v))

输出量

No path to 0
No path to 1
No path to 2
No path to 3
4 -> [1, 2, 3]
No path to 5
No path to 6
No path to 7
8 -> [5, 6, 7]
No path to 9

第二种解决方案-使用深度优先搜索

from collections import deque 

def find_using_dfs(d, value):
    " Finds using depth first searh through dictionary "

    # Use queue for Depth First Search (LIFO)
    stack = deque()

    for k, v in d.items():
        stack.append((v, [k]))

    while stack:
        v, path = stack.pop()
        if isinstance(v, dict):
            for k, viter in v.items():
                path.append(k)
                stack.append((viter, path[:]))
                path.pop()

        elif v == value:
            return path

    return None   

dic = {1 : {2 : 
             {3 : 4}
            }, 
        5 : {6 :
             {7 : 8}}}

for v in range(0, 10):
    found = find_path_proc(dic, v)
    if found:
        print("{} -> {}".format(v, found))
    else:
        print("No path to {}".format(v))

输出量

No path to 0
No path to 1
No path to 2
No path to 3
4 -> [1, 2, 3]
No path to 5
No path to 6
No path to 7
8 -> [5, 6, 7]
No path to 9

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

获取对字典值的引用

来自分类Dev

在python字典中赋值(复制与引用)

来自分类Dev

引用自身中的字典

来自分类Dev

如何在字典列表中引用和返回值

来自分类Dev

在Swift字典中存储引用

来自分类Dev

在字典中引用嵌套枚举?

来自分类Dev

在字典扩展中引用自身

来自分类Dev

从资源字典中引用主窗口的字典

来自分类Dev

在python中将引用的文件移动到字典中

来自分类Dev

如何引用特定的键/值字典?

来自分类Dev

在Python中替换字典时,是否可以引用字典从键中获取值?

来自分类Dev

了解Python中的引用

来自分类Dev

如何在 python 中修改 Python 变量的值(如引用)

来自分类Dev

Python动态自引用字典

来自分类Dev

带有字典的复杂引用,python

来自分类Dev

Python 通过引用和字典副本

来自分类Dev

在字典中存储对对象的引用

来自分类Dev

快速字典中作为键的引用

来自分类Dev

从pandas数据框中删除字典引用

来自分类Dev

如何从TextBlock中删除字典资源引用?

来自分类Dev

引用对象中的通用值

来自分类Dev

从Java中的数组引用值

来自分类Dev

从spring配置中引用值

来自分类Dev

从记录中引用通用值

来自分类Dev

在矩阵中引用值(扩展)

来自分类Dev

在矩阵中引用值(扩展)

来自分类Dev

静态引用原则中的值

来自分类Dev

在Python字典中将可变项(例如列表)引用为值-最佳做法是什么?

来自分类Dev

字典中结构键的值相等和类键的引用相等