2D列表上的排列(Python)

时间:2015-07-25 20:47:44

标签: python algorithm list multidimensional-array permutation

我有一个复杂的排列问题,我发现很难编码。

忍受我,这可能看起来有点难看。

我有这种形式:

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)]

任何人都知道我该如何处理这个问题?或者任何提示?

1 个答案:

答案 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模块中的permutationsitertools来执行此操作(您还需要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)]]