python中

时间:2015-11-19 18:17:23

标签: python list merge permutation

我想获得所有可能的方法来合并python中的2个(或理想的n个)列表,同时保持每个列表的内部顺序 - 即我想找到一些函数all_merges,其行为如下:

a = all_merges([1,2],[3,4]) 

结果:

a = [
[1,2,3,4],
[1,3,2,4],
[1,3,4,2],
[3,1,2,4],
[3,1,4,2],
[3,4,1,2]   ]

(我希望这都是他们所有人)

我找不到简单的,' pythonic'这样做的方法 - 请帮助!

=====

注意:

我正在考虑这样的事情(写得相对可读):

from itertools import permutations
def all_merges(list1,list2):
    a = [1]*len(list1)
    b = [2]*len(list2)
    indexes = list(set(list(permutations(a+b))))
    lists = [[]]*3
    res = indexes # just for readability, will be overwriting indexes as we go along
    for perm in indexes:
        lists[1] = copy(list1)
        lists[2] = copy(list2)
        merge = perm
        for i in range(0,len(perm)):
            merge[j] = lists[perm[i]].pop(0)
    return res

但是在阶段

list(set(list(permutations(a+b))

如果列表的总长度大到15,我会从

获得大量结果
permutations(a+b)

(准确地说是15!),而最多我只会有15个不同的合并。(/ p>)

我意识到这里提供了对该行的替换,作为函数:permutations with unique values 但到现在为止,这变得越来越混乱,我想看看是否有一个更清晰的解决方案来解决我原来的问题。

1 个答案:

答案 0 :(得分:3)

每个可能的合并直接对应于s = "010" i = int(s, 10) print i # 10 方法之一,以便为最终列表中(len(a) + len(b)) choose len(a)的元素选择len(a)个位置:

a

这可以通过多种方式扩展到更多列表,例如通过使用某种技术(可能是Algorithm L)来通过所有方式为列表元素分配位置,或者通过重复应用双向合并。