2017-08-24 186 views
0

如何獲得其兩個節點均位於給定節點列表內的所有邊。 G.edges([list_of_nodes])將返回所有節點,其中每個邊的至少一個節點位於list_of_nodes中。我不要那個。我怎麼才能得到它?獲取節點列表中的邊緣

+0

請給我一些關於投票的線索嗎? – sovon

+0

輕微提示:「我不想那樣,我怎麼能得到它?」另外這個:https://stackoverflow.com/help/how-to-ask – BoboDarph

+0

我不明白。是不是謙虛?如果是這樣的話,我的觀點是:「我寫了這行文字來指定我想做什麼,不想做什麼,我想,我應該真正澄清」。謝謝 – sovon

回答

2

您可以遍歷已經找到的所有邊,並測試兩個節點是否在節點列表中,但如果節點列表很大,則這不是最優的。檢查一個列表是否包含一個元素需要迭代整個列表,所以平均而言,每條邊都需要2*len(list)/2檢查[len(list)/2 for each node]。假設邊的數量與len(list)成正比,則這具有二次時間。

edges = [(u,v) for u,v in G.edges(list_of_nodes) if u in list_of_nodes and v in list_of_nodes] 

更有效的方法將測試節點是否在一個集合而不是一個列表。集允許非常快速地檢查它們是否包含元素。每次測試幾乎爲O(1)。所以完整的東西在線性時間運行。

set_of_nodes = set(list_of_nodes) 
edges = [(u,v) for u,v in G.edges(set_of_nodes) if u in set_of_nodes and v in set_of_nodes] 
+0

我也這麼做。但由於我擁有數百萬的邊緣,所以速度非常慢。 – sovon

+0

你使用'set_of_nodes'而不是'list_of_nodes'嗎? – Joel

+0

我在開始回答之前就開始使用這個列表了,這很慢。現在我用了set,​​它非常快。非常感謝你 – sovon