在Python

时间:2017-06-22 18:59:49

标签: python python-3.x permutation

这不是一个特别复杂的问题,但我正在寻找一种有效/干净的方法来生成所有可能的元组排列。

例如,给定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)vs(2,2),(2,2)vs(3,2)...... etc

对于列,比较将为(1,1)vs(1,2),(1,1)vs(1,3),(1,2)vs(1,3),...( 2,1)vs(2,2),(2,1)vs(2,3),(2,2)vs(2,3)...... etc

有谁知道生成每对元组的简单方法?我想将比较中的两个元组传递给一个单独的函数(tuple1,tuple2)。有一个想法,但它使用多个for循环,似乎效率低下。将不胜感激。

1 个答案:

答案 0 :(得分: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)