7

我正在尝试生成一个由 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 的排列和组合,但是这些在位置上起作用,而不是在导致重复的值上起作用。

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

4

3 回答 3

8

使用itertools.product

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

示例itertools.product([False,True],repeat=2)

(False, False)
(False, True)
(True, False)
(True, True)
于 2011-08-12T21:06:42.910 回答
4

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

>>> 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)]
于 2011-08-12T20:58:25.413 回答
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 维笛卡尔积是思考这个问题的正确方法,但这种方法让我咯咯笑。

于 2011-08-12T21:17:15.403 回答