您可以为此使用itertools.product:
from itertools import product
d = [0,1]
x = [list(t) for t in product(d,repeat=4)]
这给出了:
>>> x
[[0, 0, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0], [0, 0, 1, 1], [0, 1, 0, 0], [0, 1, 0, 1], [0, 1, 1, 0], [0, 1, 1, 1], [1, 0, 0, 0], [1, 0, 0, 1], [1, 0, 1, 0], [1, 0, 1, 1], [1, 1, 0, 0], [1, 1, 0, 1], [1, 1, 1, 0], [1, 1, 1, 1]]
通过将repeat= 修改为例如5,您可以获得所有可能的 5 位数列表。
如果您不需要列表 - 不应该更改元素 - 可以使用元组,在这种情况下,您可以删除 list(..) 构造:
# list of tuples
from itertools import product
d = [0,1]
x = list(product(d,repeat=4))
这会生成:
>>> x
[(0, 0, 0, 0), (0, 0, 0, 1), (0, 0, 1, 0), (0, 0, 1, 1), (0, 1, 0, 0), (0, 1, 0, 1), (0, 1, 1, 0), (0, 1, 1, 1), (1, 0, 0, 0), (1, 0, 0, 1), (1, 0, 1, 0), (1, 0, 1, 1), (1, 1, 0, 0), (1, 1, 0, 1), (1, 1, 1, 0), (1, 1, 1, 1)]
注意product(..) 本身是一个生成器:它懒惰地生成元素。如果结果元素的数量很大并且您可以一次处理一个,这将很有用。在这种情况下,您最好不要构建列表。例如,您可以使用:
for tup in product(d,repeat=4):
print(tup)
打印所有元组。虽然效果与for tup in x: 相同,但现在内存使用可以更低(这取决于解释器中垃圾收集器的实现):因为并非所有元组都必须在内存中同时。生成器发出的下一个元组可能重用上一个元组占用的内存,因为那个地方现在是空的(至少考虑到你没有将元组存储在列表中等)