-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:

から少なくとも 1 つのソリューションが必要です。[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]

2 番目の要素と 3 番目の要素がソリューションごとに一意になるように (1 番目の要素 = 0、2 番目の要素 = 1、3 番目の要素 = 2)

o/p は : [0,1,11]および[1,7,9]および[2,8,10]

間違った出力: [0,1,11], [1,6,11] ,[2,8,10] ここでは、1 番目と 2 番目のパラメーター 3 は同じです。

4

1 に答える 1

0

私の理解が正しければx、最初、2 番目、3 番目の要素がすべて 1 つのトリプレットで一意になるように、指定された配列からトリプレットを生成する必要があります。それを行うコード:

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])

わずか3行で同じことを行う、よりpythonicなソリューション

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 に答える