簡體   English   中英

在python中正確生成單詞

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM