2014-12-07 19 views
0

特別是我正在查看是否有一些cartesian_product()方法內置到python中,或者使用itertools來完成這項工作,從而避免編寫嵌套的多維循環。python:我如何實現列表中所有列表的笛卡爾積?

例如我有以下

input = [ 
    [1], 
    [[2]], 
    [3], 
    [[a,b,c] , [[z,x,y]] , [d,f,g]], 
    4 
] 

期待:

output = [ 
    [1,2,3,a,b,c,4] 
    [1,2,3,z,x,y,4] 
    [1,2,3,d,f,g,4] 
] 

的一個特別的挑戰是,如在上述輸入列表,一個項目可以具有一個列表的任何層,但它應該能夠忽略所有這些並且仍然產生平坦的結果。

+1

該示例不是笛卡爾產品! – alfasin 2014-12-07 05:01:27

+1

此外,'input'是python中的一個關鍵字 - do * not *用它作爲變量名! – alfasin 2014-12-07 05:06:04

+0

相關:http://stackoverflow.com/questions/533905/get-the-cartesian-product-of-a-series-of-lists-in-python – dmcc 2014-12-07 05:07:36

回答

2

要添加上@ rorra的回答的頂部,以打印結果「扁平」,添加以下功能:

def flat(l): 
    def _flat(l, r):  
     if type(l) is not list: 
      r.append(l) 
     else: 
      for i in l: 
       r = r + flat(i) 
     return r 
    return _flat(l, []) 

,然後(rorra的有輕微的修改代碼):

_input = [ 
    [1], 
    [[2]], 
    [3], 
    [['a','b','c'] , [['z','x','y']], ['d','f','g']], 
    4 
] 

_input = map(lambda(x): x if isinstance(x, list) else [x], _input) 

import itertools 
for element in itertools.product(*_input): 
    print flat(list(element)) # this line was modified 

輸出

[1, 2, 3, 'a', 'b', 'c', 4] 
[1, 2, 3, 'z', 'x', 'y', 4] 
[1, 2, 3, 'd', 'f', 'g', 4] 
3
input = [ 
    [1], 
    [[2]], 
    [3], 
    [['a','b','c'] , [['z','x','y']], ['d','f','g']], 
    4 
] 

input = map(lambda(x): x if isinstance(x, list) else [x], input) 

import itertools 
for element in itertools.product(*input): 
    print element 
+0

你已經改變了輸入從int'4'到列表'[4]'? – 2014-12-07 05:02:14

+0

是的,爲了使用itertools.product,只需將任意標量轉換爲列表 – rorra 2014-12-07 05:08:58

+0

是的,但我認爲應該包含在代碼implimentation中,而不是手動更新輸入? – 2014-12-07 05:11:00