我想定义一个有给定列数的数组(比如说n=5),数组的每个单元格中的值可以是0或1。我希望创建所有可能的1和0,这意味着,每一行代表一个可能的n元素向量。
换句话说,我希望这个表是这样的。
我知道创建1和0的向量很容易,但是我如何确保这些向量不会在表格中重复,并且所有可能的组合都包含在内(如果我的计算正确的话,表格应该有2**5=32行)。
如何在Python中实现?非常感谢您
用itertools很容易。
itertools.product(*[[0, 1]] * 3)
结果是...
[(0, 0, 0),
(0, 0, 1),
(0, 1, 0),
(0, 1, 1),
(1, 0, 0),
(1, 0, 1),
(1, 1, 0),
(1, 1, 1)]
你可以生成32以内的所有数字,并使用位移将每个数字转换为二进制表示。
combs = [[(n >> p) & 1 for p in range(4, -1, -1)] for n in range(32)]
从而得到 combs
作为。
[
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 1],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 1],
[0, 0, 1, 1, 0],
[0, 0, 1, 1, 1],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 1],
[0, 1, 0, 1, 0],
[0, 1, 0, 1, 1],
[0, 1, 1, 0, 0],
[0, 1, 1, 0, 1],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 1],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 1],
[1, 0, 0, 1, 0],
[1, 0, 0, 1, 1],
[1, 0, 1, 0, 0],
[1, 0, 1, 0, 1],
[1, 0, 1, 1, 0],
[1, 0, 1, 1, 1],
[1, 1, 0, 0, 0],
[1, 1, 0, 0, 1],
[1, 1, 0, 1, 0],
[1, 1, 0, 1, 1],
[1, 1, 1, 0, 0],
[1, 1, 1, 0, 1],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 1]
]
或者,你可以使用一个递归生成函数,
def gimme_combs(n):
if n == 1: return [[0], [1]]
lower_combs = gimme_combs(n - 1)
return [[0] + c for c in lower_combs] + \
[[1] + c for c in lower_combs]
当与以下函数一起调用时,会得到同样的结果。
combs = gimme_combs(5)