例如:
[[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)
生成所有可能组合的列表,然后在该列表中查找任何包含重复项的列表,但这对于我的目的来说成本太高了。有人有什么想法吗?
这个怎么样?
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)]
您可以采用在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)]
这可能对内存更友好,因为它不会构建所有组合的列表然后进行过滤;相反,它会随时过滤。