2014-10-10 59 views
1

我想將兩個輸入列表合併在一起,並獲取其元素的所有排列,以便保留每個輸入列表中元素的排序。排序的兩個列表中的元素與訂單限制

舉例來說,如果我有兩個列表:['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來之前一個,c在d)之前。

我發現一個帖子處理類似的問題,但使用字符串作爲輸入,而不是列表:Restricted Permutations of Strings in Python。例如,將字符串「ba」和「cd」作爲輸入,將返回字符串「bacd」,「bcad」,「bcda」,「cbad」,「cbda」,「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 
+2

'list.append'是就地操作,如在Python傳統,因此返回'None' 。 – jonrsharpe 2014-10-10 17:54:22

+3

'list.append'返回'None'。你想'perms.append([list1 [0]] + item)'。 – zch 2014-10-10 17:55:55

+0

謝謝!我用'perms.append([list1 [0]] + item)'替換了'perms.append([list1 [0]]。append(item))'',它工作正常! – ben 2014-10-10 18:00:04

回答

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'] 
相關問題