具有订单限制的两个列表的元素的排列

时间:2014-10-10 17:49:12

标签: python list permutation

我想将两个输入列表合并在一起并获取其元素的所有排列,以便保留每个输入列表中元素的顺序。

例如,如果我有两个列表:['b','a']['c','d'],我想获得以下列表:

['b', 'a', 'c', 'd'], 
['b', 'c', 'a', 'd'], 
['b', 'c', 'd', 'a'], 
['c', 'b', 'a', 'd'], 
['c', 'b', 'd', 'a'], 
['c', 'd', 'b', 'a']

保留原始列表中元素的顺序(b在a之前,c在d之前)。

我发现一篇帖子处理类似的问题,但使用字符串作为输入而不是列表:Restricted Permutations of Strings in Python。例如,使用字符串" ba"和" cd"作为输入,字符串" bacd"," bcad"," bcda"," cbad"," cbda",& #34; CDBA"将被退回。

我试图将代码调整到我的问题,但它没有用。使用与上面相同的例子,我得到[None,None,None,None,None,None]而不是我期望的6个列表。以下是我使用的代码。

def ordered_permutations(list1, list2):
    perms = []
    if len(list1) + len(list2) == 1:
        return [list1 or list2]
    if list1:
        for item in ordered_permutations(list1[1:], list2):
            perms.append([list1[0]].append(item))
    if list2:
        for item in ordered_permutations(list1, list2[1:]):
            perms.append([list2[0]].append(item))
    return perms

1 个答案:

答案 0 :(得分:2)

list.append()返回None,因为列表已就地更改。您应该使用连接:

def ordered_permutations(list1, list2):
    perms = []
    if len(list1) + len(list2) == 1:
        return [list1 or list2]
    if list1:
        for item in ordered_permutations(list1[1:], list2):
            perms.append([list1[0]] + item)
    if list2:
        for item in ordered_permutations(list1, list2[1:]):
            perms.append([list2[0]] + item)
    return perms

然后生成所需的输出:

>>> def ordered_permutations(list1, list2):
...     perms = []
...     if len(list1) + len(list2) == 1:
...         return [list1 or list2]
...     if list1:
...         for item in ordered_permutations(list1[1:], list2):
...             perms.append([list1[0]] + item)
...     if list2:
...         for item in ordered_permutations(list1, list2[1:]):
...             perms.append([list2[0]] + item)
...     return perms
... 
>>> for combo in ordered_permutations(['b','a'], ['c', 'd']):
...     print combo
... 
['b', 'a', 'c', 'd']
['b', 'c', 'a', 'd']
['b', 'c', 'd', 'a']
['c', 'b', 'a', 'd']
['c', 'b', 'd', 'a']
['c', 'd', 'b', 'a']