2D列表上的排列(Python)



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

请原谅我,这可能看起来有点丑。

我有这样的东西:

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模块的productpermutations来做(你还需要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)]]

相关内容

  • 没有找到相关文章

最新更新