【发布时间】:2021-10-08 07:04:03
【问题描述】:
我有n 索引导致n(n-1)/2 成对组合,例如为n=3
(i,j,k) -> (i,j), (i,k), (j,k)
现在对于每一对我都知道可能性,例如
(i,j) = (1,2), (1,3), (2,2)
(i,k) = (2,2), (1,2), (2,4)
(j,k) = (1,2), (4,3), (2,2)
换句话说,在(i,j,k) 的某种组合中,我们必须让(i,j) 是(1,2) 或(1,3) 或(2,2),其他对也一样。我希望构造所有可能的组合,所以在上面的例子中只有两种可能的组合:
(i,j,k) = (2,2,2)
(i,j,k) = (1,2,2)
我目前已经实现了这个过程如下:
import numpy as np
ij = np.array(([1,2], [1,3], [2,2]))
ik = np.array(([2,2], [1,2], [2,4]))
jk = np.array(([1,2], [4,3], [2,2]))
possibilities = []
possible_i = np.union1d(ij[:,0], ik[:,0])
possible_j = np.union1d(ij[:,1], jk[:,0])
possible_k = np.union1d(ik[:,1], jk[:,1])
for i in possible_i:
for j in possible_j:
if ([i,j] == ij).all(1).any():
for k in possible_k:
if (([i,k] == ik).all(1).any() and
([j,k] == jk).all(1).any()):
print(i,j,k)
虽然这可行并且可以很容易地适应任何n,但它对我来说似乎不是很有效,例如它会检查组合:
1 2 2
1 2 2
1 2 3
1 2 4
1 3 2
1 3 3
1 3 4
2 2 2
2 2 2
2 2 3
2 2 4
当然,我们知道在检查(i,j,k) = (i,2,3) 无效后,我们不必重新检查此表单的其他组合。有没有更有效的方法来解决这个任务(这也适用于更高的n)?
【问题讨论】:
-
您是否已经查看了
itertools模块中提供的itertools.pairwise()、itertools.product()、itertools.combinations()或itertools.permutations()? -
@albert 是的!但到目前为止没有成功..
-
print(list(itertools.combinations(('i', 'j', 'k'), 2)))输出[('i', 'j'), ('i', 'k'), ('j', 'k')]这与您的介绍性示例相同。这有什么问题? -
@albert 我不确定你在暗示什么,但这绝不是我问题的答案。我正在尝试在 itertools 不支持的约束下找到组合
-
抱歉,我似乎不理解您的限制。
标签: python list set combinations