我发布了这个问题,因为所有现有的答案都使用孤岛来解决这个问题,这是不一样的(至少我不知道如何将当前的解决方案转移到三维)。
假设我们有以下脚本,它生成从(1到127)不等的三维整数的所有离散组合:
for j, k, l in itertools.combinations(range(1, 128), 3):
result = calculations([128, i, j, k, 0])
writeFile(result+"\n")
假设脚本在随机(记录)点被中断,例如[128, 121, 98, 45]
。我们如何使用孤岛(或任何其他库)继续下一次迭代,即[128, 121, 98, 46]
,直到[128,127,126,125]
谢谢您抽时间见我,
发布于 2022-02-11 23:33:23
作为一种有点肮脏的攻击,iter(f, sentinel)
生成一个迭代器,它反复调用给定的函数,直到它返回给定的前哨值为止,因此,如果您知道最后一个完成的值,可以将combos.__next__
和最后一个给定的值传递给iter
,然后耗尽该迭代器跳到下一个可行的项:
import itertools, collections
all_combos = iter(map(set, itertools.combinations(range(1, 128), 3)))
LAST_RECORDED_COMBO = {121, 98, 45}
ITER_WE_WANT_TO_SKIP = iter(all_combos.__next__, LAST_RECORDED_COMBO)
# taken right from https://stackoverflow.com/questions/36763084/how-to-efficiently-exhaust-an-iterator-in-a-oneliner
collections.deque(ITER_WE_WANT_TO_SKIP, maxlen=0)
for combo in all_combos: # all_combos has now skipped forward
print(combo) # original loop etc.
以上所述只不过是在看到最后一次使用这样的组合时,只在组合体中循环而已:
for c in all_combos:
if c == LAST_RECORDED_COMBO:
break
for combo in all_combos: # all_combos has now skipped forward
print(combo) # original loop etc.
但经过优化后,它可以完全在C层上运行,就像islice
一样,以提高性能。
我之所以在这里使用map(set, ..)
,是因为前哨值必须相等,这意味着对列表或元组的排序会影响到它的正确停止,否则就会有非常糟糕的反馈,因为它只会耗尽整个迭代器,而没有明确说明原因。
https://stackoverflow.com/questions/71085505
复制相似问题