我正在尝试生成一个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的排列和组合,但是这些都取决于位置而不是值导致重复。
我确信这个问题有一个标准算法,但我很难找到它的名字。
答案 0 :(得分:8)
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维笛卡尔积是思考这个问题的正确方法,但这种方式让我傻笑。