python itertools.product错误地给出结果为[([' x'],),([0,1],),([0,1,2],)]

时间:2016-02-05 12:09:57

标签: python itertools

我有一个清单

e = [['x'], [0, 1], [0, 1, 2]] 

从这个列表中,我想生成以下输出。

[('x', 0, 0), ('x', 0, 1), ('x', 1, 0), ('x', 1, 1), ('x', 2, 0), ('x', 2,1)]

以下是我使用的代码

import itertools
f=[[0], [2], [3]]
e=[['x']if f[j][0]==0 else range(f[j][0]) for j in range(len(f))]
print(e)
List1_=[]
for i in itertools.product(e):
  List1_.append(i)
print(List1_)

但我的输出为

[(['x'],), ([0, 1],), ([0, 1, 2],)]

感谢, SANS

2 个答案:

答案 0 :(得分:2)

这就是itertools.product的用途。但是您需要更改第二个和第三个项目才能创建预期的产品。

另请注意,您需要使用*操作数来解压缩嵌套列表。因为product接受多个iterable并计算它们的乘积。因此,您需要传递子列表而不是整个列表。

>>> e = [['x'], [0, 1, 2], [0, 1]]   
>>> list(product(*e))
[('x', 0, 0), ('x', 0, 1), ('x', 1, 0), ('x', 1, 1), ('x', 2, 0), ('x', 2, 1)]

答案 1 :(得分:0)

您没有在代码中解压缩e

>>> list(product(e))
[(['x'],), ([0, 1],), ([0, 1, 2],)]
>>> 
>>> list(product(*e))
[('x', 0, 0), ('x', 0, 1), ('x', 0, 2), ('x', 1, 0), ('x', 1, 1), ('x', 1, 2)]
>>>

引自Python Docs

  

itertools.product(*iterables, repeat=1)笛卡尔输入的乘积   iterables。

     

等效于生成器表达式中的嵌套for循环。例如,   对于B中的y,product(A,B)返回与(x,y)中的x相同的返回值。

如果订单对您不利,只需将您的e列表重新排序为:

>>> e = [['x'], [0, 1, 2], [0, 1]]  

然后你可以得到你期望的输出:

>>> list(product(*e))
[('x', 0, 0), ('x', 0, 1), ('x', 1, 0), ('x', 1, 1), ('x', 2, 0), ('x', 2, 1)]