例如:
[[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)
生成所有可能组合的列表,然后查看该列表中包含重复项的任何列表,但这对我的目的而言过于昂贵。有人有任何想法吗?
答案 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)]
这可能对内存更加友好,因为它不构建所有组合的列表然后过滤;相反,它会过滤掉。