这不是一个特别复杂的问题,但我正在寻找一种有效/干净的方法来生成所有可能的元组排列。
例如,给定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循环,似乎效率低下。将不胜感激。
答案 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)