python:如何实现列表中所有列表的笛卡尔积?

时间:2014-12-07 04:54:35

标签: python

特别是我在寻找是否有一些内置于python中的cartesian_product()方法,或者使用itertools的方法来避免编写嵌套的多维循环。

例如我有以下

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]
]

一个特别的挑战是,就像在上面的输入列表中一样,一个项目可以有任何一个列表层,但它应该能够忽略所有这些并仍然产生一个扁平的结果。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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]