列出没有两个元素相同的列表列表的所有组合

时间:2013-11-12 22:23:10

标签: python list

例如:

[[1, 2, 3], [2], [1, 2, 3], [5, 6]]

将生成:

[[1, 2, 3, 5], [1, 2, 3, 6], [3, 2, 1, 5], [3, 2, 1, 6]]

不允许包含2个相同元素的任何列表:即[2,2,3,5]

我尝试使用itertools.product(*list)生成所有可能组合的列表,然后查看该列表中包含重复项的任何列表,但这对我的目的而言过于昂贵。有人有任何想法吗?

2 个答案:

答案 0 :(得分:2)

这个怎么样?

In [34]: var = [[1, 2, 3], [2], [1, 2, 3], [5, 6]]

In [35]: [i for i in itertools.product(*var) if len(i) == len(set(i))]
Out[35]: [(1, 2, 3, 5), (1, 2, 3, 6), (3, 2, 1, 5), (3, 2, 1, 6)]

In [36]: var = [[1,2,3,4], [5]]

In [37]: [i for i in itertools.product(*var) if len(i) == len(set(i))]
Out[37]: [(1, 5), (2, 5), (3, 5), (4, 5)]

答案 1 :(得分:1)

您可以采用itertools docs中找到的product公式,只需添加一个调整:

def alt_product(*args, repeat=1):
    # product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
    # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111
    pools = [tuple(pool) for pool in args] * repeat
    result = [[]]
    for pool in pools:
        result = [x+[y] for x in result for y in pool if y not in x] #tweak
    for prod in result:
        yield tuple(prod)

演示:

li = [[1, 2, 3], [2], [1, 2, 3], [5, 6]]

list(alt_product(*li))
Out[35]: [(1, 2, 3, 5), (1, 2, 3, 6), (3, 2, 1, 5), (3, 2, 1, 6)]

这可能对内存更加友好,因为它不构建所有组合的列表然后过滤;相反,它会过滤掉。