-2
x = np.array([[0,1,11],[0,2,11],[0,3,10],[0,4,10],[0,5,9],[0,6,9],[1,7,9],
              [1,5,11],[1,6,11],[2,7,11],[2,8,10]])

我对此很陌生,所以我会这样称呼 [element1,element2,element3]

我有一个如上所示的数组,我想找到这个数组的解决方案。它应满足以下条件:

第一个元素0:

它应该至少有一个解决方案[0,1,11],[0,2,11],[0,3,10],[0,4,10],[0,5,9],[0,6,9]

第一个元素1:

这个 :[1,7,9],[1,5,11],[1,6,11]

第一个元素2:

和这个 :[2,7,11],[2,8,10]

这样第二个元素和第三个元素对于每个解决方案都是唯一的(其中第一个元素=0,第二个元素=1,第三个元素=2)

o/p 可以是 : [0,1,11][1,7,9][2,8,10]

错误输出: [0,1,11], [1,6,11] ,[2,8,10] 这里第一个和第二个的参数 3 相同。

4

1 回答 1

0

如果我理解正确,您想从给定x数组中生成三元组,以便第一个、第二个和第三个元素在一个三元组中都是唯一的。执行此操作的代码:

import itertools

x = [[0,1,11],[0,2,11],[0,3,10],[0,4,10],[0,5,9],[0,6,9],[1,7,9],
              [1,5,11],[1,6,11],[2,7,11],[2,8,10]]
triplets = itertools.combinations(x,3)
for t in triplets:
  isGood = True
  for pos in range(3):
    if (t[0][pos] == t[1][pos] or t[0][pos] == t[2][pos] or t[1][pos] == t[2][pos]):
      isGood = False
  if (isGood):
    print(repr(t))

这会产生以下输出:

([0, 1, 11], [1, 7, 9], [2, 8, 10])
([0, 2, 11], [1, 7, 9], [2, 8, 10])
([0, 5, 9], [1, 6, 11], [2, 8, 10])
([0, 6, 9], [1, 5, 11], [2, 8, 10])

一个更 Pythonic 的解决方案,仅在 3 行中执行相同的操作

for t in itertools.combinations(x,3):
  if all(len(col) == len(set(col)) for col in zip(*t)):
    print(repr(t))

疯狂的单线:

print(''.join(repr(t) + '\n' for t in itertools.combinations(x,3) if all(len(col) == len(set(col)) for col in zip(*t))))
于 2015-12-20T14:59:55.890 回答