如何使用合并排序从字母列表返回元组列表作为置换形式?

时间:2016-06-23 12:07:39

标签: python recursion permutation mergesort

我有一个完整的字母列表,例如li = ["m", "i"],我希望返回一个元组列表,如,不使用任何库,如下所示

[("m", "i"), ("i", "m")]

我尝试使用合并排序和递归来解决这个问题,但是,这似乎没有返回正确的输出。我的计划如下:

def permutation1(lis):

    res = []

    if len(lis) == 1:
        res.append(lis)

    elif len(lis) > 1:

        last_index = len(lis) -1
        last = lis[last_index]
        rest = lis[:last_index]

        if rest is not None and last is not None:
            res.append(merge(permutation1(rest), last))

    return res


def merge(lis, c):

    res = []

    for s in lis:
        for i in range(len(s)+1):

            ps = s[:i]+ list(c) + s[i:]
            value =  tuple(list(ps))

            # print value
            res.append(value)

    return res

例如,输入["m", "i", "b"]时,输出为[[('b', ('i', 'm'), ('m', 'i')), (('i', 'm'), 'b', ('m', 'i')), (('i', 'm'), ('m', 'i'), 'b')]],这是不正确的。如何改进程序让我按预期运行?

1 个答案:

答案 0 :(得分:1)

试试这个。

from itertools import permutations
[i for i in permutations(li,2)]

<强>结果

[('m', 'i'), ('i', 'm')]

这里没有permutations

In [32]: [k for k in [(i,li[j])for i in li for j in range(2)] if len(set(k)) != 1]
Out[32]: [('m', 'i'), ('i', 'm')]