使用itertools创建选项矩阵
我想生成一个包含真和假的矩阵,这个矩阵能展示出给定选择数量的所有排列组合。比如说,如果有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
...
我一直在考虑使用itertools库里的排列和组合功能,但这些功能是根据位置来工作的,而不是根据值,这样就会出现重复的情况。
我相信这个问题有一个标准的算法,但我一直找不到它的名字。
3 个回答
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维笛卡尔积,我相信这是理解这个问题的正确方式,但这种方法让我忍不住笑了。
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)]
8
itertools.product([False,True],repeat=5)
这是一个 itertools.product([False,True],repeat=2)
的例子:
(False, False)
(False, True)
(True, False)
(True, True)