我有一份清单,没有。内部列表的内容是未知:
>>> 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],)
答案 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)]