2017-06-22 12 views
1

特に複雑な問題ではありませんが、タプルのすべての可能な順列を生成するための効率的でクリーンな方法を探しています。Pythonですべての可能な順列を生成する

たとえば、n x nグリッドのサイズ値(例3)が指定されているとします。

(1,1) (2,1) (3,1) 
(1,2) (2,2) (3,2) 
(1,3) (2,3) (3,3) 

私は行と列の間の比較を生成したいと思います。

行の場合、比較は(1,1)vs(2,1)、(1,1)vs(3,1)、(2,1)vs(3,1)...となります。 (1,2)対(2,2)、(2,2)対(3,2)···等

そして列については、比較は(1,1)対(1,2) (1,1)vs(1,3)、(1,2)vs(1,3)、..(2,1)vs(2,2)、(2,1)vs(2,3) 、(2,2)対(2,3)...等

誰もタプルの各ペアを生成する簡単な方法を知っていますか?比較の2つのタプルを別々の関数(tuple1、tuple2)に渡したいと思います。アイデアを得ましたが、複数のforループを使用して非効率的です。援助は高く評価されます。

答えて

2

itertools.combinations、 を使用すると、繰り返しなしで2つのインデックスのすべての組み合わせを生成できます。

だから、あなたはこのようなタプルのあなたのペアを生成することができます

from itertools import combinations 

def columns(n): 
    for j in range(1, n+1): 
     for i1, i2 in combinations(range(1, n+1), 2): 
      yield ((i1, j), (i2, j)) 

def lines(n): 
    for i in range(1, n+1): 
     for j1, j2 in combinations(range(1, n+1), 2): 
      yield ((i, j1), (i, j2)) 

n = 3 
print(list(columns(n))) 
print(list(lines(n))) 

# [((1, 1), (2, 1)), ((1, 1), (3, 1)), ((2, 1), (3, 1)), ((1, 2), (2, 2)), ((1, 2), (3, 2)), ((2, 2), (3, 2)), ((1, 3), (2, 3)), ((1, 3), (3, 3)), ((2, 3), (3, 3))] 
# [((1, 1), (1, 2)), ((1, 1), (1, 3)), ((1, 2), (1, 3)), ((2, 1), (2, 2)), ((2, 1), (2, 3)), ((2, 2), (2, 3)), ((3, 1), (3, 2)), ((3, 1), (3, 3)), ((3, 2), (3, 3))] 

をなどにそれらを使用します。

for tuple1, tuple2 in lines(n): 
    your_function(tuple1, tuple2) 
関連する問題