获取唯一列的组合

时间:2017-08-01 10:52:14

标签: python unique

我想知道是否有人知道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手动安装它。

谢谢:)

2 个答案:

答案 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]会给出与该索引相对应的列表。