生成多个列表中每个项目的组合
我想处理一个数量不确定的列表,每个列表的长度也不固定,然后从每个列表中选一个元素,生成所有可能的组合。为了提高效率,我只需要遍历每种组合,而不是把结果存下来。
比如,下面这个列表的列表:
[['A','B','C'],['w','x','y','z'],[1,2]]
会变成:
['A','w',1],['A','w',2],['A','x',1],['A','x',2],...,['C','z',1],['C','z',2]
这不是简单的合并,也不是 itertools.permutation() 的功能……如果我提前知道有多少个列表,这个事情就简单多了,但在这种情况下我并不知道。我相信我可以写一个递归的解决方案,但也许这个问题已经有人解决过了。有什么好的建议吗?
1 个回答
10
itertools.product 是你需要的工具
>>> some_list = [['A','B','C'],['w','x','y','z'],[1,2]]
>>> list(itertools.product(*some_list))
[('A', 'w', 1), ('A', 'w', 2), ('A', 'x', 1), ('A', 'x', 2), ('A', 'y', 1), ('A', 'y', 2), ('A', 'z', 1), ('A', 'z', 2), ('B', 'w', 1), ('B', 'w', 2), ('B', 'x', 1), ('B', 'x', 2), ('B', 'y', 1), ('B', 'y', 2), ('B', 'z', 1), ('B', 'z', 2), ('C', 'w', 1), ('C', 'w', 2), ('C', 'x', 1), ('C', 'x', 2), ('C', 'y', 1), ('C', 'y', 2), ('C', 'z', 1), ('C', 'z', 2)]
几个关键点
itertools.product
需要你把可迭代对象作为参数传进去。所以你需要用splat
操作符来把列表当作参数传递itertools.product
返回的是一个生成器。你需要把它转换成列表,才能查看所有内容。或者你也可以直接遍历它,或者把它传给一个需要可迭代对象的函数for e in itertools.product(*some_list): print e