从特定位置恢复(或启动)itertools.permutations?

时间:2016-02-24 14:49:45

标签: python

让我说我运行以下脚本

try:
    while 1:
        # Iteration processess of possibel keys
        for length in range(7,8): # only do length of 7
            for attempt in itertools.permutations(chars, length):
                print(''.join(attempt))

except KeyboardInterrupt:
    print "Keybord interrupt, exiting gracefully anyway."
    sys.exit()

它将开始打印

ABCDEFG
ABCDEFH
ABCDEFI
ABCDEFJ
etc..

但是我要说我退出/关闭脚本,迭代停在ABCDEFJ

是否可以从该位置(ABCDEFJ)开始,这样我就不必迭代以前迭代过的那些(ABCDEFG, ABCDEFH, ABCDEFI

问题:

如何选择itertools.permutations的起点?

3 个答案:

答案 0 :(得分:0)

如果你不退出脚本,你可以简单地保留迭代器并在以后继续使用它。从重新开始,迭代器将在从头开始的状态下创建。 itertools.permutations没有用于从中间开始的特殊API,并且生成器通常没有此功能,因为它们具有在迭代时发展的内部状态。因此,在新生成器中间启动的唯一方法是使用给定数量的元素并将其丢弃。

答案 1 :(得分:0)

你做不到。没有API支持它,您无法序列化这些对象:

i=itertools.permutations('ABC', 2)
next(i) # ('A', 'B')
next(i) # ('A', 'C')

import pickle
with open('mypickle', 'w') as f:
    pickle.dump(i, f)

  ...
  File "/usr/lib/python2.6/copy_reg.py", line 70, in _reduce_ex
    raise TypeError, "can't pickle %s objects" % base.__name__
TypeError: can't pickle permutations objects

您有两种选择:

  • 跳过您已经看到的排列(按照您的建议)或
  • 编写自己的函数,接受一个起点。

答案 2 :(得分:0)

如果您以“ wb”而不是“ w”打开文件,Karoly Horvath的答案应该可以正常工作。

在停止脚本之前,可以使用pickle将置换生成器存储在文件中。 当您继续执行脚本时,请从文件中读取排列生成器为“ rb”。

from itertools import permutations
import pickle

string = "abcdefg"
to_file = permutations(string, 3)
next(to_file)
next(to_file)

with open('pickle.pickle', 'wb') as file:
    pickle.dump(to_file, file)

with open("pickle.pickle", 'rb') as file:
    from_file = pickle.load(file)
    if next(from_file) == next(to_file):
        print("working!")

输出:

working!