0

例如:

[[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)生成所有可能组合的列表,然后在该列表中查找任何包含重复项的列表,但这对于我的目的来说成本太高了。有人有什么想法吗?

4

2 回答 2

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)]
于 2013-11-12T22:33:49.147 回答
1

您可以采用在itertools 文档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)]

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

于 2013-11-12T22:40:14.627 回答