假设我有一个图形,像这样的图形 图为,其中底层节点从左到右分别标为4,5,6,7,8.我将底层节点分为三组。(4,5), (6,7), 和(8,9). 我们分别称它们为第1组、第2组和第3组。我需要将第1组的节点连接到第2组和第3组的节点,我需要将第2组的节点连接到第3组的节点,同一组的两个节点不能连接到不同组的同一个节点。例如,这里有一个 办法. 我正试图找出一个好的代码来找到所有这样的组合。理想情况下,我希望答案是这样的形式。
[[(4,6),(5,7),(4,8),(5,9),(6,8),(7,9)],
[(4,6),(5,7),(4,8),(5,9),(6,9),(7,8)],
...etc]
其中的对子代表连接 这里,每一行代表一个可能的组合。我想出了几种方法(一种是使用许多for循环,另一种是使用itertools.product),但如果我有25个组,每个组有25个节点,这些方法就不能很好地扩展。我在搞这个的时候,也觉得也许我有什么发现。
list1=[4,5]
list2=[6,7]
list3 = [8,9]
one_two = [list(zip(x,list2)) for x in permutations(list1,2)]
one_three = [list(zip(x,list3)) for x in permutations(list1,2)]
two_three = [list(zip(x,list3)) for x in permutations(list2,2)]
但我不能完全让它工作。任何帮助都将被感激。谢谢你的帮助
澄清:我意识到解释一下我为什么这样做可能会有帮助。我试图找到一种快速改变相邻矩阵值的方法。在我上面的答案示例中,每一行都代表了我想对单个图形所做的所有改变。因此,例如,第一行写着
[(4,6),(5,7),(4,8),(5,9),(6,8),(7,9)]
这意味着我将在节点4和6、5和7、4和8、5和9、6和8、7和9之间增加一条边。这就是为什么我希望它们是成对的(而且是漂亮的行,这样我就可以很容易地迭代它们来改变我的邻接矩阵)。我希望这能帮到你
我们知道。
这意味着,如果我们知道A组中一个节点与B组的连接,我们也知道A组中另一个节点与B组的连接。
因此,我们只需要找到一个节点的连接方式,其他所有节点的连接都会被给出。
对于节点4,尊重上面的规则,有2*2种可能的方式连接到其他组。我们可以用以下方法找到它们
from itertools import product
to_group_2 = product([4], [6, 7])
to_group_2 = product([4], [8, 9])
all_possible_node_4_conns = product(to_group_2, to_group_3)
print(list(all_possible_node_4_conns))
的输出。
[((4, 6), (4, 8)), ((4, 6), (4, 9)), ((4, 7), (4, 8)), ((4, 7), (4, 9))]
现在,既然所有尚未考虑的连接都已给出(如上所述),剩下要做的就是将这些缺失的链接添加到列表中,如果需要的话。