首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用一定值的itertools.combinations在三维i、j、k中继续迭代

使用一定值的itertools.combinations在三维i、j、k中继续迭代
EN

Stack Overflow用户
提问于 2022-02-11 19:18:24
回答 1查看 57关注 0票数 1

我发布了这个问题,因为所有现有的答案都使用孤岛来解决这个问题,这是不一样的(至少我不知道如何将当前的解决方案转移到三维)。

假设我们有以下脚本,它生成从(1到127)不等的三维整数的所有离散组合:

代码语言:javascript
运行
复制
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]

谢谢您抽时间见我,

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-11 23:33:23

作为一种有点肮脏的攻击,iter(f, sentinel)生成一个迭代器,它反复调用给定的函数,直到它返回给定的前哨值为止,因此,如果您知道最后一个完成的值,可以将combos.__next__和最后一个给定的值传递给iter,然后耗尽该迭代器跳到下一个可行的项:

代码语言:javascript
运行
复制
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.

以上所述只不过是在看到最后一次使用这样的组合时,只在组合体中循环而已:

代码语言:javascript
运行
复制
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, ..),是因为前哨值必须相等,这意味着对列表或元组的排序会影响到它的正确停止,否则就会有非常糟糕的反馈,因为它只会耗尽整个迭代器,而没有明确说明原因。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71085505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档