获取节点列表中的边缘

问题描述:

如何获得其两个节点均位于给定节点列表内的所有边。 G.edges([list_of_nodes])将返回所有节点,其中每个边的至少一个节点位于list_of_nodes中。我不要那个。我怎么才能得到它?获取节点列表中的边缘

+0

请给我一些关于投票的线索吗? – sovon

+0

轻微提示:“我不想那样,我怎么能得到它?”另外这个:https://stackoverflow.com/help/how-to-ask – BoboDarph

+0

我不明白。是不是谦虚?如果是这样的话,我的观点是:“我写了这行文字来指定我想做什么,不想做什么,我想,我应该真正澄清”。谢谢 – sovon

您可以遍历已经找到的所有边,并测试两个节点是否在节点列表中,但如果节点列表很大,则这不是最优的。检查一个列表是否包含一个元素需要迭代整个列表,所以平均而言,每条边都需要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