2016-02-13 66 views
0

比方说,我有这个名单有3个项目,每个项目包含3个项目:操纵在Python大名单

list = [ [1,2,3], [4,5,6], [7,8,9] ] 

我想创建一个包含所有3 ** 2 = 9列表的项目,这意味着(X,Y,Z),其中x在[1,4,7],Y在[2,5,8]和z在[3,6,9]

组合的组合,因此,我将使用列表理解这样的:

new_list =[(x,y,z) for x in [1,2,3] for y in [4,5,6] for z in [7,8,9]] 

这是一种“手动”方法。但是如果我想在我的代码中使用每次长度不一的大型列表,我们假设一个20D列表(20个项目,每个项目包含20个项目),我如何创建一个通用类型的代码?

回答

4

您可以使用itertools.product,但结果将是3 = 27项:

>>> from itertools import product 
>>> lst = [ [1,2,3], [4,5,6], [7,8,9] ] 
>>> 
>>> list(product(*lst)) 
[(1, 4, 7), (1, 4, 8), (1, 4, 9), (1, 5, 7), (1, 5, 8), (1, 5, 9), (1, 6, 7), (1, 6, 8), (1, 6, 9), (2, 4, 7), (2, 4, 8), (2, 4, 9), (2, 5, 7), (2, 5, 8), (2, 5, 9), (2, 6, 7), (2, 6, 8), (2, 6, 9), (3, 4, 7), (3, 4, 8), (3, 4, 9), (3, 5, 7), (3, 5, 8), (3, 5, 9), (3, 6, 7), (3, 6, 8), (3, 6, 9)] 

注意,当你在处理大数据集,你并不需要的结果列表转换。由于product返回一个迭代器,因此您可以简单地循环显示产品和访问项目。

+0

这就是我正在寻找的,你对结果是正确的,那就是3 ** 3 = 27。 – user3060854