使用itertools创建选项矩阵

时间:2011-08-12 20:51:10

标签: python itertools

我正在尝试生成一个True和False值的矩阵,它显示给定数量的选择的所有排列。因此,对于5种选择,您将获得以下输出。

F F F F F
T F F F F
T T F F F
T T T F F
...
F T F F F
...

我一直在研究使用itertool的排列和组合,但是这些都取决于位置而不是值导致重复。

我确信这个问题有一个标准算法,但我很难找到它的名字。

3 个答案:

答案 0 :(得分:8)

使用itertools.product

itertools.product([False,True],repeat=5)

itertools.product([False,True],repeat=2)的例子:

(False, False)
(False, True)
(True, False)
(True, True)

答案 1 :(得分:4)

您似乎想要[False, True]的n维笛卡尔积。

>>> print list(itertools.product(*(itertools.repeat((False, True), 3))))
[(False, False, False), (False, False, True), (False, True, False), 
 (False, True, True), (True, False, False), (True, False, True), 
 (True, True, False), (True, True, True)]

或者更简洁(从Frederick窃取)

>>> print list(itertools.product((False, True), repeat=3))
[(False, False, False), (False, False, True), (False, True, False), 
(False, True, True), (True, False, False), (True, False, True), 
(True, True, False), (True, True, True)]

答案 2 :(得分:2)

这与0到(2 ** n)-1之间的整数的二进制表示形式相同。如果您倾向于这种反常,那么可以使用str.format()将整数表示为零填充二进制字符串,然后通过执行将字符串(形式为“00101”)强制转换为布尔列表像这样可怕的东西:

>>> n = 5
>>> for i in xrange(2**n):
...     [bool(int(j)) for j in ("{0:0>%db}" % n).format(i)]

我确信上面的n维笛卡尔积是思考这个问题的正确方法,但这种方式让我傻笑。