如果我知道迭代的 ID,是否可以跳过 itertools.product() 的循环迭代?

Is it possible to skip loop iterations for itertools.product() if i know the ID of the iteration?

提问人:Sir D 提问时间:11/16/2023 最后编辑:Sir D 更新时间:11/16/2023 访问量:59

问:

我有以下代码:

import math
import numpy as np
import itertools

s = [  0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,
       13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,
       26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,
       39,  40,  41,  42,  43,  44,  45,  46,  47,  48,  49,  50]

def variate4(l):
    yield from itertools.product(*([l] * 4))

for i in variate4(s):
    print(repr(''.join(str(i))))

执行的结果是数组中所有可能的四位数数字组合。 例如:(12, 32, 46, 50)。 正如我所看到的,结果总是有相同的顺序。s

是否可以通过其 id 生成组合? 例如,我的意思是结果编号 4856。

我试过这种方式:

j = 0
for i in variate4(s):
    j = j + 1
    if j == 4856:
        print(repr(''.join(str(i))))
        break

但仍然需要等到所有以前的组合都生成。 我正在尝试实现即时跳转到所需的迭代。

Python 循环 互通工具

评论


答:

2赞 blhsing 11/16/2023 #1

您可以从给定的 id 中迭代获取列表大小的模数,并将 id 除以列表大小以进行下一次迭代:

def variate_from_id(l, id, n=4):
    combination = []
    id -= 1 # since your id starts from 1
    size = len(s)
    for _ in range(n):
        combination.append(l[id % size])
        id //= size
    return tuple(reversed(combination))

因此:

variate_from_id(s, 4856)

返回:

(0, 1, 44, 10)

演示:https://ideone.com/WgTxZ8