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 に答える