通过N次交换生成所有可能的组合

2024-04-26 12:02:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个列表([[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从l1换成d从l2, 将l1的b与l2的e交换, 将来自l1的c与来自l2的f交换)

((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..

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

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


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

我不知道如何避免重复而不付出太大代价。你知道吗

谢谢你的帮助。你知道吗

谢谢


Tags: ofinl1列表for状态指令current