Python itertools产品从某些开始

Ami*_*old -1 python-itertools python-3.x

我有一个非常大的产品,期望来自itertools.product.

for result in product(items, repeat=9):
    # stuff
Run Code Online (Sandbox Code Playgroud)

这需要花费很多时间,我正在寻找从某个项目开始的方法,因为我无法一次性完成.

我可以做以下事情:

gen = product(items, repeat=9):
for temp in gen:
    if temp == DESIRED_VALUE:
        break
for result in gen:
    # stuff
Run Code Online (Sandbox Code Playgroud)

但这需要花费很多时间,就像我刚刚重启程序一样.那么,有没有办法"跳过去"而不浪费时间迭代整个事情?

Tad*_*sen 5

虽然我一开始就严厉关注强奸密码,但我可以提供一个答案.

您可以使用islice在迭代中跳过一定数量的步骤.这意味着您需要跟踪到目前为止已完成的尝试次数,以便知道以后要恢复的位置.

START_VALUE = 200
all_combos = itertools.product(letters,repeat=9)

#start at START_VALUE and stop at None (the end)
combos = itertools.islice(all_combos,START_VALUE,None)

for i,password in enumerate(combos,start=START_VALUE):
    ...
Run Code Online (Sandbox Code Playgroud)

请注意,这仅适用于以下sys.maxsize.

您还可以使用相同的公式计算给定密码的索引以转换基数:

def check_value(password):
    pos = len(letters)
    value = 0
    for i,c in enumerate(reversed(password)):
        value+= (pos**i) * letters.index(c)
    return value


>>> check_value("aaaacbdaa")
29802532
Run Code Online (Sandbox Code Playgroud)