让我说我运行以下脚本
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
的起点?
答案 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!