在python中正确生成单词

时间:2017-03-24 17:30:19

标签: python loops scalability

我认为这段代码的意图很明确。我希望在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]

1 个答案:

答案 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:相同,但现在内存使用可以更低(这取决于解释器中垃圾收集器的实现):因为并非所有元组都有在同时在内存中。生成器发出的下一个元组可能重用上一个元组所占用的内存,因为该位置现在是空的(至少考虑到你没有将元组存储在列表中等)。