2017-08-01 14 views
0

誰かが繰り返しのない列の組み合わせを返すPython関数を知っているかどうかを知りたい。たとえば、一意の列の組み合わせを取得する

a= [[1,2], 
    [3,4]] 
# 1,4 is allowed since not the same column. 
# 2,3 is allowed since not the same column. 
# 1,3 is not allowed since its the same column. 
# 2,4 is not allowed since its the same column. 

カスタム機能を使用しても、私はそれを見て、その背後にある論理を理解したいと思います。

可能であれば、私はモジュールの機能をデフォルトでPythonですぐに利用できるようにしたいので、pipで手動でインストールする必要があるnumpyのようなものは望ましくありません。

感謝:)

+0

は、1つの組み合わせが必要なようです。そのために、ランダムなインデックスを生成してそれらを引き出すことができます。例えば ​​'a [0] [random(2)]、a [1] [random(2)]' –

+1

の入力は何ですか? – Haranadh

+0

私の実際の入力は正方行列mat = [[1,2,3]、[4,5,6]、[7,8,9]]です。 – pyCharmer

答えて

1

あなたはitertools.productを使用してenumerateを使用して、列のインデックスを生成した後、同じ列の項目を除外することができます

from itertools import product 

def prod(*args): 
    for (i, x), (j, y) in product(*map(enumerate, args)): 
     if i != j: 
     yield (x, y) 

a= [[1,2], 
    [3,4]] 
print(list(prod(*a))) 
# [(1, 4), (2, 3)] 

a= [[1,2,3], 
    [4,5,6]] 
print(list(prod(*a))) 
# [(1, 5), (1, 6), (2, 4), (2, 6), (3, 4), (3, 5)] 

あなたは何の列をチェックしないことにより、複数の行と列のためにこれを一般化することができますそれぞれの組み合わせで繰り返される:

from itertools import product 

def prod(*args): 
    for items in product(*map(enumerate, args)): 
     if len({i for i, _ in items}) == len(items): 
     yield tuple(x for _, x in items) 
+0

あなたのコードは私の例で動作しますが、私の例から正方行列への入力を変更すると失敗します。例えば、a = [[1,2,3]、[4,5,6]、[7,8,9]]はスケールアップできません。 – pyCharmer

+0

@pyCharmer更新私の答え –

+0

まあ、そこにいくつかの美しいコードです。私は理解できるように、これを混乱させる必要があります。 – pyCharmer

0

を大きな正方行列の場合、あなたはcoluの使用順列を取ることができますMNS:最後の行について

from itertools import * 

b = [ 
     [1,2,3], 
     [4,5,6], 
     [7,8,9], 
    ] 


def combs(mat=b): 
    ncols = len(b[0]) 
    yield from ([mat[i][j] for i, j in inds] 
      for inds in map(enumerate, 
       permutations(range(ncols)))) 

# In [86]: list(q.combs()) 
# Out[86]: [[1, 5, 9], [1, 6, 8], [2, 4, 9], [2, 6, 7], [3, 4, 8], [3, 5, 7]] 

N x Nマトリックス与えられたが、これまでの任意の列から二つ以上を選ぶことなく、各列から要素を選択するには、正確にN!方法があります:あなたが最初の行にNの選択肢があり、 N-1などがあります。したがって、要件を満たす各組み合わせは順列によって固定されます。 map(enumerate, permutations(range(ncols)))は、すべての有効なインデックスのリストを返します。与えられたインデックスindsに対して、[mat[i][j] for i, j in inds]は、そのインデックスに対応するリストを与える。

+0

醜い 'itertools import *'からなぜですか? –

+0

なぜそれが醜いのか分かりませんが、真実であれば、単に「順列」が必要です。 –

+0

行からの歩留まりに構文エラーが発生します。私はなぜこれが当てはまるのでしょうか?また、その行を簡単な方法で説明することもできます。 – pyCharmer

関連する問題