特别是我在寻找是否有一些内置于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]
]
一个特别的挑战是,就像在上面的输入列表中一样,一个项目可以有任何一个列表层,但它应该能够忽略所有这些并仍然产生一个扁平的结果。
答案 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]