我认为这段代码的意图很明确。我希望在X中包含所有可能的输入单词,每个数字都是列表中的元素。以下代码适用于4位数字,但对于较大的单词则不可持续。如何使其更具可扩展性?让我们假设我想要n个数字而不是4个数字。
d = [0,1]
X = [[x1,x2,x3,x4] for x1 in d for x2 in d for x3 in d for x4 in d]
答案 0 :(得分:3)
您可以使用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:
相同,但现在内存使用可以更低(这取决于解释器中垃圾收集器的实现):因为并非所有元组都有在同时在内存中。生成器发出的下一个元组可能重用上一个元组所占用的内存,因为该位置现在是空的(至少考虑到你没有将元组存储在列表中等)。