提问人:Sir D 提问时间:11/16/2023 最后编辑:Sir D 更新时间:11/16/2023 访问量:59
如果我知道迭代的 ID,是否可以跳过 itertools.product() 的循环迭代?
Is it possible to skip loop iterations for itertools.product() if i know the ID of the iteration?
问:
我有以下代码:
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
但仍然需要等到所有以前的组合都生成。 我正在尝试实现即时跳转到所需的迭代。
答:
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)
评论