我有一个复杂的排列问题,我发现很难编码。
请原谅我,这可能看起来有点丑。
我有这样的东西:
L = [ [[(1, 2)], [(1, 2),(1, 3)]], [[(2, 3)]] ]
我想这样输出所有的"排列":
[ [(1,2),(2,3)], [(2,3),(1,2)], [(1,2),(1,3),(2,3)], [(2,3),(1,2),(1,3)] ]
直观地说,我需要列表中包含的元组的所有排序(没有重复)。但是,同一列表中的元组不能在一起。如。[[(1、2)]、[(1、2),(3)]],(1、2)和(1、2),(3)在同一个列表。因此,输出中的元素不能为(1,2)(1,3)(1,2)。
我写了一些混乱的代码来完成这项工作,但需要清理输出:
output=[]
for x in input:
for y in x:
a=[]
for x1 in input:
if x!=x1:
for y1 in x1:
a.append(list(permutations([y,y1],len([y,y1]))))
output.append(a)
这就足够了,但我还需要能够为这样的输入执行此操作:
[[[(1, 2)], [(1, 2), (1, 3)]], [[(2, 3)]], [[(4,5),(6,7)]]
因此,像这样的元素将包含在输出中:
[(4,5),(6,7),(1,2),(2,3)]
有人知道我应该怎么做吗?或者有什么建议吗?
我可能错了,但据我所知,您想要做几个集合(其元素本身就是集合)的笛卡尔积:
[[(1,2)], [(1,2),(1,3)]] X [[(2,3)]]
则对于该笛卡尔积的每个元素,求其包含的所有元素的排列,在此例中,笛卡尔积的元素为:
([(1, 2)],[(2, 3)])
([(1, 2),(1, 3)], [(2, 3)])
最后取每个元素的所有排列:
第一个元素:排列((1、2),[(2、3)]),([(2、3)],[(1、2)])
第二个元素:排列(((1、2),(3)],[(2、3)]),([(2、3)],[(1、2),(3)])
如果这是你想要的,那么你可以用itertools
模块的product
和permutations
来做(你还需要chain
在元组列表中正确地转动每个排列并获得你想要的确切输出):
from itertools import product, permutations, chain
L = [ [[(1, 2)], [(1, 2),(1, 3)]], [[(2, 3)]] ]
for element in product(*L):
for permutation in permutations(element):
print(list(chain(*permutation)))
[(1, 2), (2, 3)]
[(2, 3), (1, 2)]
[(1, 2), (1, 3), (2, 3)]
[(2, 3), (1, 2), (1, 3)]
你可以直接使用列表推导式获得'permutations'列表:
result = [list(chain(*permutation)) for element in product(*L) for permutation in permutations(element)]
[[(1, 2), (2, 3)],
[(2, 3), (1, 2)],
[(1, 2), (1, 3), (2, 3)],
[(2, 3), (1, 2), (1, 3)]]