我想知道是否有人知道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中使用模块中的函数,所以不要像numpy那样需要通过pip手动安装它。
谢谢:)
答案 0 :(得分: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)
答案 1 :(得分:0)
对于较大的方形矩阵,您可以使用列的排列:
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]
会给出与该索引相对应的列表。