【问题标题】:Recursive traversal of a dictionary in python (graph traversal)python中字典的递归遍历(图遍历)
【发布时间】:2023-03-29 06:46:02
【问题描述】:

我有一本结构如下的字典:

 KEY    VALUES
 v1 = {v2, v3}
 v2 = {v1}
 v3 = {v1, v5}
 v4 = {v10}
 v5 = {v3, v6}

键的值实际上是与其他键的链接。通过使用我想要到达其他键的值直到最后。正如您在 v4 中看到的那样,某些键未链接。我认为这类似于图遍历?


v1开始我想去所有其他的值:

v1 --> v2 --> v1
   --> v3 --> v1
          --> v5 --> v3
                 --> v6      
v4 --> v10 

def travel():
  travel_dict = defaultdict(list)
  travel_dict[v1].append(v2)
  travel_dict[v1].append(v3)
  travel_dict[v2].append(v1)
  travel_dict[v3].append(v1)
  travel_dict[v3].append(v5)
  travel_dict[v5].append(v3)
  travel_dict[v5].append(v6)
  travel_dict[v6].append(v5)
  travel_dict[v4].append(v10)

我可以使用什么递归函数来遍历字典?

【问题讨论】:

    标签: python dictionary recursion graph multimap


    【解决方案1】:

    一个简单的解决方案是保留一组“已访问”的已知节点:

    def reach(travel_dict, x, visited=None):
        if visited is None:
            visited = set() # see note
        visited.add(x)
        for y in travel_dict.get(x, []):
            if y not in visited:
                yield y
                for z in reach(travel_dict, y, visited):
                    yield z
    

    用作

    for y in reach(travel_dict, x):
        print("you can go to", y)
    

    注意:唯一棘手的部分是 Python 中的默认参数是在创建函数对象而不是在调用函数时评估的,因此使用可变默认值是一个问题,因为更改将在函数返回后仍然有效。

    【讨论】:

    • 真的很有趣对不起。在数据集上测试它需要一些时间。我能够正确遍历所有节点。 @6502 您是否会将数据存储在图表中并进行图表遍历而不是字典?还是实际上是一样的?
    • @HaniGoc:图是一种抽象数据结构,可以用几种方式表示......其中之一是列表字典(但您可以使用包含 @987654323 的示例对象@list 作为成员之一)。哪个更好取决于许多因素(如果您更关心速度或大小,您需要执行哪种查询,图表是静态的还是动态的......)。
    【解决方案2】:

    这是一种方法:这会在返回之前将每个元素递归地简化为字符串形式。这对您来说应该是一个很好的起点

    def traverse(obj):
        '''
        stringify individual elems of an object where object can be a nested structure
        '''
        if isinstance(obj, dict):
            return dict((str(k),traverse(v)) for k,v in obj.items())
        else:
            return str(obj)  # no container, just values (str, int, float)
    

    【讨论】:

      猜你喜欢
      • 2013-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-02
      • 1970-01-01
      • 2018-12-02
      相关资源
      最近更新 更多