我有一个复杂的排列问题,我发现很难编码。
忍受我,这可能看起来有点难看。
我有这种形式:
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),(1,3)]],(1,2)和(1,2),(1,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)]
任何人都知道我该如何处理这个问题?或者任何提示?
答案 0 :(得分:2)
我可能错了,但根据我的理解,你想要做几个合奏的笛卡尔积(其元素本身就是合奏):
[[(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),(1,3)],[(2,3)]),([(2,3)],[(1,2),(1) ,3)])
如果这是您想要的,那么您可以使用product
模块中的permutations
和itertools
来执行此操作(您还需要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)]
您可以直接获取排名列表'列表推导:
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)]]