[英]Correct generation of words in python
我認為這段代碼的意圖很明確。 我希望在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]
您可以使用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:
的for tup in x:
相同,但現在內存使用率可能更低(這取決於解釋器中垃圾收集器的實現):因為並非所有元組都必須在內存中相同時間 。 生成器發出的下一個元組可能會重用上一個元組所占用的內存,因為該位置現在是空的(至少考慮到你沒有將元組存儲在列表中,等等)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.