【问题标题】:Generate permutations of list by swapping specific elements通过交换特定元素生成列表的排列
【发布时间】:2019-01-05 02:18:10
【问题描述】:

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

例如,如果我们有列表:

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

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

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

也就是说,如果列表与第 2 个元素交换,我们只能交换第 0 个元素,第 4 个元素与第 1 个元素交换(可以有任意数量的允许交换对)。 考虑到允许的交换,我希望该函数返回列表的不同配置的数量。

由于我计划为大型列表和许多允许的交换运行此功能,因此该功能最好尽可能高效。

我找到了通过交换所有元素(一次交换两个)来生成排列的示例,但我找不到指定某些允许交换对的方法。

【问题讨论】:

    标签: python list combinations permutation cartesian-product


    【解决方案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]]
    

    你能从那里拿走吗?就是这样。我会让你概括算法。

    【讨论】:

    • 感谢您的建议。当我在 for 循环中打印 soln 时,它是一个包含两个数字而不是 4 的列表。我错过了什么吗?
    • 不,我遗漏了一些东西——应该是 (a[0], a[2]) 的排列与 (product) (a[1], a[ 4])。在我出门的路上,或者我会修复伪代码并测试它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    相关资源
    最近更新 更多