2012-11-13 4 views
1

Можно создать дубликат:
Using itertools.product and want to seed a valueПродолжайте создавать список возможных строк в Python

У меня есть этот код, который генерирует последовательный список строк.

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

Я хочу, чтобы иметь возможность продолжить выполнение этого скрипта из последней известной строки. Как это можно сделать?

+1

Определить «Последние известные»? – StoryTeller

+2

Это может быть актуально: http://stackoverflow.com/questions/9864809/using-itertools-product-and-want-to-seed-a-value – abought

ответ

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.

Это предполагает, что вы пытаетесь возобновить работу, когда вы остановились на нескольких сценариях сценария, или в других сценариях, где решение генератора неприменимо. Если вы можете использовать генератор, вы должны.

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) 

Точка генераторов заключается в том, что они несут свое состояние с ними.

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))