【问题标题】:Permutations on 2D lists (Python)二维列表上的排列(Python)
【发布时间】:2015-10-16 07:59:20
【问题描述】:

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

请耐心等待,这可能看起来有点难看。

我有这种形式的东西:

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

有人知道我应该如何处理这个问题吗?或者有什么建议?

【问题讨论】:

  • 这个问题我很不清楚。您所说的“排列”是什么意思,以及列表的哪一部分?列表中的几层嵌套有什么意义呢?输出的顺序应该是什么,应该如何分组?列表可以嵌套到任意深度吗?目前,我无法完全理解这个问题所问的问题,而且我有点怀疑其他人也可以。
  • 同意 Score_Under。在问题的第二部分,您似乎只是想获取所有唯一的元组。
  • 我不明白这个问题。看起来有一些基本元素是两个整数的列表,也许您希望它们的所有排列一次 1、2 和 3 不重复但计算不同的顺序。一种方法是首先创建一个所有 uniqe 基本元素的列表,然后在 1、2 和 3 组中列出它们的排列。使用 itertetools.permutations 很容易做到这一点,因为它需要一个指定组长度的参数(称为r f 表示元组长度)。见docs.python.org/3/library/itertools.html#itertools.permutations
  • @ate50eggs 它很复杂,没有从它周围的数学背景中获得的数学直觉和视觉表示。我会回去尝试让它更清楚。唯一元组是相关的,但不完全相关。
  • @TrisNefzger 直观地说,我需要列表中包含的元组的所有排序(不重复)。但是,同一列表中的元组不能在一起。例如。对于 [[(1, 2)], [(1, 2),(1, 3)]], (1,2) 和 (1,2),(1,3) 在同一个列表中。所以输出中的元素不能是(1,2)(1,3)(1,2)。

标签: python algorithm list multidimensional-array permutation


【解决方案1】:

我可能是错的,但据我了解,您想做几个集成(其元素本身就是集成)的笛卡尔积:

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

如果这是您想要的,那么您可以使用 itertools 模块中的 productpermutations你想要的输出):

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

【讨论】:

  • 优秀的答案。如果这不能完全解决问题,它至少应该给我一个好的起点。非常感谢。
猜你喜欢
  • 2013-08-30
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多