适当时退出itertool.product循环

时间:2016-11-08 16:28:02

标签: python python-3.x passwords itertools

printable = '0123456789abcdefghijklmnopqrstuvwxyz'

unknown = "abcd"

[''.join(i) for i in itertools.product(printable, repeat = 4)]

我正试图找到一种在itertool行中嵌入一些东西的方法:

if i == unknown:
    print("the unknown was", i)

然后打破循环。这样做的原因是我希望能够在没有记忆填满的情况下搜索更长的单词。

1 个答案:

答案 0 :(得分:1)

列表推导并不是真正意义上的任务 - 它们意味着创建列表!

看起来你想要这样的东西:

printable = '0123456789abcdefghijklmnopqrstuvwxyz'
unknown = "abcd"

for i in itertools.product(printable, repeat = 4):
    guess = ''.join(i) 
    if guess == unknown:
        print("the unknown was", i)
        break

但是,如果你仍然想要一个单行,你可以使用生成器表达式。生成器表达式与列表推导完全一样,除非它们不存储下一个元素。我们可以像列表一样使用它们,或者使用next(gen)获取下一个元素。

printable = '0123456789abcdefghijklmnopqrstuvwxyz'
unknown = "abcd"

correct = next(''.join(i) for i in itertools.product(printable, repeat = 4) if ''.join(i) == unknown)
print("the unknown was", correct)