如何使用python迭代器生成多个变量的笛卡尔积?

时间:2010-10-25 10:38:20

标签: python iterator cartesian-product

亲爱的, 给定一个变量,比如三个值,我试图生成所有可能的组合,例如,这些变量的三元组。

虽然这段代码可以解决问题,

site_range=[0,1,2]
states = [(s0,s1,s2) for s0 in site_range for s1 in site_range for s2 in site_range]

它有点,嗯,笨拙,如果我尝试对三个以上变量的组合做同样的事情,情况会变得更糟

因此,我的Python 101问题:

  1. 如何使用迭代器重写上面的代码?我的意思是,是否有可能产生一个迭代器,它会产生上述“状态”的元素?

  2. 是否可以扩展此功能,不仅可以生成三联体,还可以生成4粒,5粒等等?

2 个答案:

答案 0 :(得分:4)

import itertools
site_range=[0,1,2]
[x for x in itertools.product(site_range, repeat=len(site_range))]

答案 1 :(得分:3)

使用itertools.product

>>> site_range=[0,1]
>>> list(product(site_range, repeat=3))
[000 001 010 011 100 101 110 111]

编辑正如@Glenn Maynard在评论中指出的那样,这不是笛卡尔积。为此,您必须检查his answer