簡體   English   中英

python中字典的遞歸遍歷(圖遍歷)

[英]Recursive traversal of a dictionary in python (graph traversal)

我有一個具有以下結構的字典:

 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)

我可以用什么遞歸函數來旅行字典?

一個簡單的解決方案是保留一組“已訪問”的已知節點:

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中的默認參數在創建函數對象時進行評估,而不是在調用函數時進行評估,因此使用可變默認值是一個問題,因為更改將在函數返回后保持有效。

這是一種方式:在遞歸之前,遞歸地將每個元素簡化為字符串形式。這應該是一個很好的起點

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM