使用itertools创建选项矩阵

7 投票
3 回答
1810 浏览
提问于 2025-04-16 23:30

我想生成一个包含真和假的矩阵,这个矩阵能展示出给定选择数量的所有排列组合。比如说,如果有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

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

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

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

撰写回答