1

可能的重复:
使用 itertools.product 并希望播种一个值

我有这段代码,它生成一致的字符串列表。

import itertools
choices = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789"
for length in range(0,20):
    for entry in itertools.product(choices, repeat = length):
        string = ''.join(entry)
        print string

我希望能够从最后一个已知字符串继续运行此脚本。这怎么可能?

4

3 回答 3

4
import itertools
def choices():
    choices = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789"
    for length in range(0,20):
        for entry in itertools.product(choices, repeat = length):
            string = ''.join(entry)
            yield string

choice_seq = choices()
print next(choice_seq)
print next(choice_seq)

生成器的意义在于它们随身携带状态。

于 2012-11-13T21:13:09.653 回答
2

假设您将变量string设置为最后一个已知字符串(或''从头开始):

import itertools
choices = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789"
for length in range(len(string), 20):
    itr = itertools.product(choices, repeat = length)
    if string != '' and length == len(string):
        itr = itertools.dropwhile(tuple(string).__ne__, itr)
    for entry in itr:
        string = ''.join(entry)
        print string

请注意,这将打印的第一个元素是最后一个已知字符串。如果您想跳过最后一个已知字符串并从打印下一个字符串开始,您可以next(itr)在 if 语句中执行。

这假设您正在尝试从中断的位置继续执行脚本的多次执行,或者生成器解决方案不适用的其他场景。如果你可以使用发电机,你应该。

于 2012-11-13T21:14:32.153 回答
0

您的“保存状态”只是当前长度,以及itertools.product. 这两种东西都可以腌制。所以,这里有一些伪代码:

import itertools
import pickle

choices = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789"

def tryWithStateSave(currentlength, currentproduct):
    try:
        for entry in currentproduct:
            string = ''.join(entry)
            print string
    except KeyboardInterrupt:
        pickle.dump((currentlength, currentproduct), <saved state file>)
        raise

if <a saved state file exists>:
    currentlength, currentproduct = pickle.load(<the saved state file>)
    tryWithStateSave(currentlength, currentproduct)
    currentlength += 1
else:
    currentlength = 0

for length in range(currentlength+1,20):
    tryWithStateSave(length, itertools.product(choices, repeat = length))
于 2012-11-13T21:55:44.507 回答