我有一个清单
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
答案 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)]