在 python 中正确生成单词
Correct generation of words in python
我认为这段代码的意图很明确。我想在 X 中包含所有可能的输入词,每个数字都是列表中的一个元素。下面的代码适用于 4 位数字,但对于更大的单词来说是不可持续的。我怎样才能使它更具可扩展性?假设我想要 n 位而不是四位的单词。
d = [0,1]
X = [[x1,x2,x3,x4] for x1 in d for x2 in d for x3 in d for x4 in d]
你可以使用 itertools.product
:
<b>from itertools import product</b>
d = [0,1]
x = [list(t) for t in <b>product(d,repeat=4)</b>]
这给出:
>>> 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 = <b>list(</b>product(d,repeat=4)<b>)</b>
这会生成:
>>> 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(..)
本身 是一个生成器 :它 延迟生成元素 。如果结果元素的数量很大并且您可以处理它们一次一个,这将很有用。在那种情况下,您最好不要构建列表。例如,您可以使用:
<b>for</b> tup <b>in product(d,repeat=4)</b>:
print(tup)
打印所有元组。尽管效果与 for tup in x:
相同,但现在内存使用量 可以 更低(这取决于解释器中垃圾收集器的实现):因为不是所有元组必须同时在内存中。生成器发出的下一个元组可能 重用 前一个元组占用的内存,因为那个地方现在是空的(至少假设你没有将元组存储在列表中,等等)
我认为这段代码的意图很明确。我想在 X 中包含所有可能的输入词,每个数字都是列表中的一个元素。下面的代码适用于 4 位数字,但对于更大的单词来说是不可持续的。我怎样才能使它更具可扩展性?假设我想要 n 位而不是四位的单词。
d = [0,1]
X = [[x1,x2,x3,x4] for x1 in d for x2 in d for x3 in d for x4 in d]
你可以使用 itertools.product
:
<b>from itertools import product</b>
d = [0,1]
x = [list(t) for t in <b>product(d,repeat=4)</b>]
这给出:
>>> 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 = <b>list(</b>product(d,repeat=4)<b>)</b>
这会生成:
>>> 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(..)
本身 是一个生成器 :它 延迟生成元素 。如果结果元素的数量很大并且您可以处理它们一次一个,这将很有用。在那种情况下,您最好不要构建列表。例如,您可以使用:
<b>for</b> tup <b>in product(d,repeat=4)</b>:
print(tup)
打印所有元组。尽管效果与 for tup in x:
相同,但现在内存使用量 可以 更低(这取决于解释器中垃圾收集器的实现):因为不是所有元组必须同时在内存中。生成器发出的下一个元组可能 重用 前一个元组占用的内存,因为那个地方现在是空的(至少假设你没有将元组存储在列表中,等等)