通过交换特定元素来生成列表的排列

时间:2018-07-27 23:33:22

标签: python list combinations permutation cartesian-product

我正在尝试编写一个函数,该函数通过交换某些允许的元素对来生成列表的所有可能配置。

例如,如果我们有以下列表:

lst = [1, 2, 3, 4, 5]

我们只允许交换以下几对元素:

pairs = [[0, 2], [4, 1]]

即,如果列表的第2个元素和第4个元素的第1个元素,则我们只能交换第0个元素(可以有任意数量的允许交换对)。 我希望该函数返回给定允许的交换次数的列表的不同配置数。

由于我打算针对大型列表和许多允许的交换运行此函数,因此最好使函数尽可能高效。

我已经找到了通过一次交换所有元素来生成置换的示例,但是我找不到一种方法来指定某些对允许的交换。

1 个答案:

答案 0 :(得分:1)

您已被通用术语“交换”引诱到其他生产途径。切换攻击。相反,请注意,您需要[a [0],a [2]]和[a [1],a [4]]的乘积才能获得所有可能的排列。您采用每种产品(其中四种),并按正确的顺序分配结果集中的元素。看起来像这样模糊...在某种程度上,我正在使用Python作为伪代码。

seq = itertools.product([a[0], a[2]], [a[1], a[4]])
for soln in seq:
    # each solution "soln" is a list of 4 elements to be distributed.
    # Construct a permutation "b" by putting each in its proper place.
    # Map the first two soln values to b[0] and b[2];
    # and the last two values to b[1] and b[4]
    b = [soln[0], soln[2], soln[1], a[3], soln[4]]

可以从那里拿走吗?那是主意;我让您概括一下算法。