2016-11-06 98 views
0
import itertools 
printable = 'abcdefghijklmnopqrstuvwxz' 
all_possibilites = ([''.join(i) for i in itertools.product(printable, repeat = 3)]) 
comparison = ['zd'] 
if comparison in all_possibilities: 
    print("match") 

這是我的代碼片段。我的意圖是生成每一個字母組合。這裏的片段有三個字符的限制。限制過大的python會返回內存錯誤。我的問題是:我如何從內存中刪除不正確的結果?

有沒有辦法從內存中刪除不匹配的組合,以便唯一的限制是時間而不是內存?說如果字符限制是5?任何進一步的閱讀也會有所幫助。

+0

你試圖達到的目的究竟是什麼?你的意思是所有可能的字母組合?隨着您將重複大小增加到無窮大,將會有無限組合。你所做的任何n字母組合都會存在,那麼比較的目的是什麼?如果我有itertools.product(範圍(3),重複= 3),您將有每個可能的3位組合0,1和2 - 您不需要檢查它是否存在。當然,記憶會快速填滿...... n = 5時你已經有26^5個組合。 – Daniel

回答

0

主要的錯誤是您首先創建完整列表然後嘗試將其過濾掉。這是一個問題,因爲你在內存中帶來了完整的列表。

你會更好的加入條件列表解析裏,讓你真正需要的所有元素:

all_posibilities = ["".join(i) for i in itertools.product(printable, repeat = 5) if 'a' or 'b' in i] 
             ## ^^ place your condition here 
print(len(all_posibilities)) 

或者,如果你正在尋找通過all_posibilities到底迭代,它創建生成器以進一步限制內存佔用情況是有意義的:

all_posibilities = ("".join(i) for i in itertools.product(printable, repeat = 5) if 'a' or 'b' in i) 
for i in all_posibilities: 
    # do things