如何置换/组合不同大小的列表?蟒蛇

时间:2014-10-20 15:34:56

标签: python list itertools lambda

我有一份清单,没有。内部列表的内容是未知

>>> x = [1,2,3]
>>> y = [4,5,6,7]
>>> z = [8]
>>> lol = [x,y,z]

我需要按照lol列表的顺序从内部列表中的每个项目中获取组合,我一直这样做以获得所需的输出:

>>> for i in x:
...     for j in y:
...             for k in z:
...                     print [i,j,k]
... 
[1, 4, 8]
[1, 5, 8]
[1, 6, 8]
[1, 7, 8]
[2, 4, 8]
[2, 5, 8]
[2, 6, 8]
[2, 7, 8]
[3, 4, 8]
[3, 5, 8]
[3, 6, 8]
[3, 7, 8]

上面做pythonic的方法是什么?这是否有itertools函数?

我已经尝试itertools.product,但我没有得到所需的输出:

>>> from itertools import product
>>> for i in product(lol):
...     print i
... 
([1, 2, 3],)
([4, 5, 6, 7],)
([8],)

3 个答案:

答案 0 :(得分:4)

你真的很亲密:

>>> for i in product(*lol):
...   print i
...
(1, 4, 8)
(1, 5, 8)
(1, 6, 8)
(1, 7, 8)
(2, 4, 8)
(2, 5, 8)
(2, 6, 8)
(2, 7, 8)
(3, 4, 8)
(3, 5, 8)
(3, 6, 8)
(3, 7, 8)

doc中,有product(A, B)等示例。所以你应该将每个列表作为参数传递。在您的情况下,product(x,y,z)可以解决问题。 *lol符号用于unpacking

答案 1 :(得分:4)

itertools.product为每个集合采用单独的参数,而不是包含集合的单个迭代。

for i in product(*lol):
    print i

答案 2 :(得分:0)

正如其他答案所示,你需要解压lol。 作为替代方案,在我看来,列表理解更加pythonic:

import itertools


x = [1,2,3]
y = [4,5,6,7]
z = [8]
lol = [x,y,z]

print [each for each in itertools.product(*lol)] # or set()

[(1, 4, 8), (1, 5, 8), (1, 6, 8), (1, 7, 8), (2, 4, 8), (2, 5, 8), (2, 6, 8), (2, 7, 8), (3, 4, 8), (3, 5, 8), (3, 6, 8), (3, 7, 8)]