首页 > 解决方案 > 通过进行 N 次交换生成所有可能的组合

问题描述

我有一个列表列表([[a,b,c],[d,e,f],[g,h,i]...]).

我试图通过在当前状态上进行 N 次交换,将列表中的一个项目与另一个列表中的一个项目交换,从而生成从该状态可到达的所有可能列表。

例如 - 用 d 交换 a,用 e 交换 b,用 g 交换 f(注意我们正在寻找从这个状态可能的 N 交换)

但是,我不想执行实际的交换,而是生成一个交换指令列表,其中还包括sublist.

因此,N=3 的示例输出将是:

((1: a, 2: d), (1: b, 2: e), (1: c, 2: f))

(意思是 a froml1与 d froml2交换, b froml1与 e froml2交换, c froml1与 f from交换l2

((1: a, 2: e), (1: b, 2: d), (1: c, 2: f))

((1: a, 3: g), (1: b, 3: h), (1: c, 3: i))

etc..

但是,最大的问题是 - 请注意第一个交换指令和第二个交换指令将导致相同的 list,我不确定如何有效地识别和消除这种情况。

现在我正在使用一个非常愚蠢的递归函数,它不能区分交换是否已经执行。这是代码:


def swap(list, num_of_swaps, current_swap, swap_instructions = []):
    for l1 in range(0,len(list)):
        for l2 in range(l1+1,len(list)):
            for e1 in list[l1]:
                for e2 in list[l2]:
                    swap_instructions.append({l1:{'add': e2, 'remove': e1},
                                              l2:{'add': e1, 'remove':e2}})

                    if current_round < max_repetitions:
                        swap(list, num_of_swaps, current_round+1, swap_instructions)

                    success = swap_and_do_checks(list, swap_instructions)
                    if success:
                        return swap_instructions

                    del swap_instructions[-1]

    return []

我不知道如何避免重复而不成本太高。

将感谢您的帮助。

谢谢

标签: pythonpython-3.xalgorithm

解决方案


推荐阅读