我想将两个输入列表合并在一起并获取其元素的所有排列,以便保留每个输入列表中元素的顺序。
例如,如果我有两个列表:['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
答案 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']