查找边缘列表中有多少重复连接[python]

时间:2017-01-13 21:44:00

标签: python graph duplicates

给出边缘列表,例如

edges = [[1, 2], [1, 3], [2, 3], [4, 5], [4, 6], [5, 6], [10, 11], [12, 9], [12, 10]]

我需要找到列表中有多少重复连接。

在此示例中:连接按顺序

进行
dup = 0

1-2

1-2-3

然后[2,3]已经连接,因此我们将dup增加1

1-2-3, 4-5

1-2-3, 4-5-6

然后[5,6]已经连接,所以我们再次将dup增加1

1-2-3, 4-5-6, 10-11

1-2-3, 4-5-6, 9-12, 10-11

1-2-3, 4-5-6, 9-10-11-12 

返回dup = 2

最后一步是我的方法搞砸了,因为它将[12,10]计为重复,因为我当前的方法是将数字添加到字典中并检查x和y是否都在字典中然后我将dup增加1

但我真正需要做的是检查x和y是否已经连接,如果是,那么将dup增加1

但我很难找到办法做到这一点。

2 个答案:

答案 0 :(得分:1)

在我看来,你基本上有一个邻接列表,你需要的是一个邻接矩阵。以下是我将如何做到这一点:

  1. 制作一个二维数组(这是邻接矩阵)。对于您给出的示例,这将是12x12矩阵。使用所有False值初始化矩阵

  2. 对于每条边,输入相应位置的True值(即对于[1,2],您将在位置[1,2]和[2,1]中输入True)

  3. 现在,您还需要标记间接连接。对于[1,2]的新True条目,您可以在第2行中找到所有True值,并将第1行中的相应值设置为True(反之亦然)

  4. 注意:在更新表之前,您可以通过检查第1行和第2行都是True的位置来检查重复项

答案 1 :(得分:0)

在研究这个问题时,我遇到了一个名为networkx的软件包。显然,这个问题非常简单。我喜欢90%的编程只依靠聪明人来完成所有的努力,因为我肯定做不到。

import networkx as nx

def find_duplicate_edges(edges):
    graph = nx.Graph()
    for n1, n2 in edges:
        if graph.has_node(n1) and graph.has_node(n2) and nx.has_path(graph, n1, n2):
            yield n1, n2
        else:
            graph.add_edge(n1, n2)

if __name__ == '__main__':
    edges = [[1, 2], [1, 3], [2, 3], [4, 5], [4, 6], [5, 6], [10, 11], [12, 9], [12, 10]]
    for edge in find_duplicate_edges(edges):
        print(edge)

<强>输出

(2, 3)
(5, 6)