我正在尝试编写一个应用程序来强制完全小写,仅限字母,6个字符长的密码,其中2个字母重复两次。我尝试使用itertools.product(string.lowercase, 6)
,但即使我有一台非常“强劲”的计算机,它也没有足够的RAM来完成计算,这是因为itertools
实际上在返回之前构建了一个完整的列表。
那么我想到了一个像[0, 0, 0, 0, 0, 0]
那样的列表,它会从右到左计数,每当索引达到26时它会回到0,而它左边的槽将增加1,除了我还没有找到一种方法来编码。
我一直在试图破解这个问题已经有一段时间了,现在转到这里是我的最后一招,任何算法提示都非常受欢迎。我很抱歉这是一个“家庭作业”类型的问题,但我真的对此感到茫然。
答案 0 :(得分:3)
使用这样的东西可以在不占用太多内存的情况下工作:
import itertools
import string
for guess in itertools.product(string.lowercase, repeat=6):
if checkguess(''.join(guess)):
print("Password is: {0}".format(''.join(guess)))
itertools.product
逐个生成可能的组合。它不返回任何东西,它是一个生成器函数。请参阅python documentation。 itertools
中的所有函数都表现得像或处理迭代器,因此得名。
如果您的代码占用了大量内存,您可能希望在此处发布,因此我们可能会找到罪魁祸首。
根据DSM对更快代码的建议,您可以执行以下操作:
import string
from itertools import product, combinations, permutations
for guess_chars in combinations(string.lowercase, 4):
for doubled_chars in combinations(guess_chars, 2):
for guess in permutations(guess_chars + doubled_chars):
#...