如何生成包含 4 个元素的所有可能的二进制列表? (使用 Python)

How can I generate all the possible binary lists with 4 elements? (Using Python)

我想知道有没有一种方法可以生成一个列表,其子列表是 0 和 1 与 4 个元素的所有可能组合?要生成单独的子列表,我有

import random
binum = np.random.randint(2, size=4).tolist()

但是我怎样才能得到一个包含所有可能的子列表的完整列表,每个子列表出现一次?所以所需的输出看起来像:

[[0,0,0,0],[0,0,0,1]...[1,0,0,1]...[1,1,1,1]]

(本例一共有16个元素)。谢谢:)

只需遍历从 0 到 15 的数字并获得它们的二进制表示:

In [1]: N = 4    

In [2]: def getbit(value, bitnum):
   ...:     mask = 1 << bitnum
   ...:     return (value & mask) >> bitnum
   ...: 

In [3]: [[getbit(i, j) for j in range(N)] for i in range(2 ** N)]
Out[3]: 
[[0, 0, 0, 0],
 [1, 0, 0, 0],
 [0, 1, 0, 0],
 [1, 1, 0, 0],
 [0, 0, 1, 0],
 [1, 0, 1, 0],
 [0, 1, 1, 0],
 [1, 1, 1, 0],
 [0, 0, 0, 1],
 [1, 0, 0, 1],
 [0, 1, 0, 1],
 [1, 1, 0, 1],
 [0, 0, 1, 1],
 [1, 0, 1, 1],
 [0, 1, 1, 1],
 [1, 1, 1, 1]]

在 numpy 中相同:

np.unpackbits(np.expand_dims(np.arange(2 ** N, dtype=np.uint8), -1),
              axis=1, bitorder='little', count=N)

另外,可以通过对二进制数组进行自增运算来生成下一个元素:

def gen(l=4):
    a = [0 for _ in range(l)]
    while True:
        yield a.copy()
        i = 0
        while i < l and a[i]:
            a[i] = 0
            i += 1
        if i == l:
            break
        a[i] = 1

你基本上想要从 0 到 2**n 的所有二进制数。因此,您可以使用以下代码生成它们:

def get_binary_numbers(n):
    format_str = f"0{n}b"
    max_binary_number = 2**n
    return [list(format(i, format_str)) for i in range(max_binary_number)]

注意它的性能,如果你需要很大的 n 值,那么可以使用相同的想法和其他方法来生成列表。

您可以使用 itertools 库获取输入的笛卡尔积

from itertools import product

bit_sets = product(range(2), repeat=4)
# format your data code ...

详情请见 https://docs.python.org/3.1/library/itertools.html?highlight=combinations#itertools.product