2011-05-13 42 views
2

我有任意的(但統一的)數字列表的任意列表。 (它們是我想要繪製角的n空間中bin的邊界座標,但這並不重要。)我想生成所有可能組合的列表。所以:[[1,2],[3,4],[5,6]]產生[[1,3,5],[1,3,6],[1,4,5],[1, 4,6],[1,2,3,5] ...]。python遞歸列表中沒有isinstance(不同)

任何人都可以幫助我改進此代碼嗎?我不喜歡isinstance()調用,但我不能找出更多的python-ish方法來追加第一遍的元素,當第一個arg(pos)是一個數字列表而不是列表列表。

def recurse(pos, vals): 
    out = [] 
    for p in pos: 
     pl = p if isinstance(p,list) else [p] 
     for x in vals[0]: 
      out.append(pl + [x]) 
    if vals[1:]: 
     return recurse(out, vals[1:]) 
    else: 
     return out 


a = [[1,2,3],[4,5,6],[7,8,9],[11,12,13]] 

b = recurse(a[0], a[1:]) 

謝謝。

回答

6

從你的例子似乎所有你想要的是

from itertools import product 
a = [[1,2,3],[4,5,6],[7,8,9],[11,12,13]] 
print list(product(*a)) 
0

爲了更Python你不想做的類型檢查。 Python全都是關於風管輸入的。如果將元組傳遞給函數會發生什麼(應該更有效)。

你可以嘗試

if type(p) != list: 
    try: 
     p = list(p) 
    except TypeError: 
     p = [p] 
pl = p  
1

itertools.product

import itertools 

a = [[1,2,3],[4,5,6],[7,8,9],[11,12,13]] 
iterator = itertools.product(*a) 
result = [item for item in iterator.next()] 
0

嘗試當有圖書館/模塊,你想要做什麼,你應該選擇使用它(+1所有那些誰提到itertools.product)。但是,如果您對算法感興趣,則需要尋找一類算法,稱爲recursive descent

answer = [] 
def recurse(points, curr=[]): 
    if not points: 
     answer.append(curr) 
     curr = [] 
     return 
    else: 
     for coord in points[0]: 
      recurse(points[1:], curr+[coord])