在特定条件下生成边缘组合

时间:2018-01-28 20:10:23

标签: python algorithm combinations combinatorics

我有一个图形的边缘表示为(node_from,node_to)。

我想有效地生成形式(0,x)的2个边的所有组合,其中0是我的图中的节点0 - 结合形式(x,n)的2个边的所有组合,其中n是"最终节点" (在我的图中我知道)。我已经将所有边缘都放在一个集合中,或者每个节点都包含每个其他节点的边缘(例如,您可以直接遍历该范围以生成组合)。

有效的组合可能是

  • (0,1),(0,5),(7,n),(11,n)或
  • (0,1),(0,5),(5,n),(11,n)或
  • (0,1),(0,N),(0,N),(11,n)的

而且,为了说清楚,我想要组合而不是排列。我不想重复使用同一个小组。

我一般都非常擅长弄清楚这些东西,但我对这个问题有点麻烦。

1 个答案:

答案 0 :(得分:1)

编辑:更新以满足"只有两个开始/结束边缘的要求"

我不确定您的界面是什么,但根据我的理解,您可以使用filter()选择{{1}开始的边缘子集}"或者"以0"。

结尾
n

现在,您可以使用>>> edges = [(0,1), (0,5), (0,2), (5,3), (2,9), (4,6), (6,9), (3,9), (0,9)] >>> edges_start = filter(lambda e: e[0] == 0, edges) >>> edges_end = filter(lambda e: e[1] == 9, edges) >>> edges_end [(2, 9), (6, 9), (3, 9), (0, 9)] >>> edges_start [(0, 1), (0, 5), (0, 2), (0, 9)] 从每个列表中生成所有可能的对。这是一个例子:

itertools.combinations()

现在,您可以插入>>> import itertools >>> list(itertools.combinations(edges_start, 2)) [((0, 1), (0, 5)), ((0, 1), (0, 2)), ((0, 1), (0, 9)), ((0, 5), (0, 2)), ((0, 5), (0, 9)), ((0, 2), (0, 9))] 以从一个列表中生成"对的所有组合"和"从其他列表":

配对
itertools.product()

那就是它!你可以"压扁"数据结构如果你愿意,但这是可选的:

>>> edges_start_pairs = list(itertools.combinations(edges_start, 2))
>>> edges_end_pairs = list(itertools.combinations(edges_end, 2))
>>> pairs = list(itertools.product(edges_start_pairs, edges_end_pairs))

现在让我们打印结果:

>>> flat_pairs = [list(p[0]+p[1]) for p in pairs]