簡體   English   中英

在列表字典中查找循環

[英]Finding cycles in a dictionary of lists

我有一個 python id 字典。 每個 id 都有一組它引用的其他 id。 如何在字典中找到循環引用?

我的字典的一個例子是:

{1: [3], 2: [1], 3: [2, 4], 4: [2, 3]}.

每個 id 鍵的值是它引用的其他 id 的列表,它們不能引用自己。

因此,如果存在循環引用,output 將是:

{3, 4 , 3}.

我正在努力弄清楚如何 go 解決這個問題,因為這似乎是一個常見問題。 非常感謝您提供幫助的任何人。

networkx庫可以在您的圖中找到循環。 您將需要實例化一個有向圖,因為 ID 之間的鏈接是單向的。 您的圖表中有多個循環。 例如,3 到 4,4 到 3。這也被認為是一個循環。

import networkx as nx

data = {1: [3], 2: [1], 3: [2, 4], 4: [2, 3]}
graph = nx.DiGraph(data)

list(nx.simple_cycles(graph))
# returns:
[[1, 3, 4, 2], [1, 3, 2], [3, 4]]

如果您正在尋找長度僅為 2 的循環引用,即僅針對 (i,j) 對,這樣 i 引用 j 並且 j 引用 i,那么下面的代碼有效:

d = {1: [3], 2: [1], 3: [2, 4], 4: [2, 3]}

for i in d:
    for j in d[i]:
        if i in d[j]:
            print("Cycle found: ", i, j)

Output:

Cycle found:  3 4
Cycle found:  4 3

        

上面的程序做了以下工作:對於字典中的每個鍵 i,如果 i 引用了 j,那么檢查 j 是否也引用了 i(即 i 是否也在 d[j] 中),如果是,則打印 i 和 j。 您可以擴充程序以僅在 i < j 時存儲(或打印)(i,j),以免每個循環打印兩次。

如果你還想打印更大長度的循環引用(比如當 i 引用 j,j 引用 k,k 引用 i),那么你可以構造一個邊集為 {(i,j): i references j} 的有向圖,並運行一種算法(例如約翰遜算法)來查找有向圖中的所有基本循環。

暫無
暫無

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

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