from itertools import combinations
from more_itertools import consume
k = 170
index_list = [16, 32, 48, 62, 76, 88, 100, 110, 120, 128, 136, 142, 148, 153, 158, 161, 164, 166]
for n in range(1, k+1):
iterable = combinations(range(k), n)
for output in iterable:
print(output)我有可迭代性和一个包含上面所示索引的列表: index_list表示间隔:从0到16,从17到32,从33到48等等。最后的间隔是167比k-1.当我循环可迭代时,每当在同一间隔内有两个输出值时,我想跳过多个步骤。例如,输出(0,1):这两个值都在0-16区间内,所以下一个输出应该是(0,17)。之后的输出将是(0,18),(0,19),.,(0,k-1),因为这些不是在一个间隔内。之后,输出将被跳过(1,2),以此类推。然后,当输出为(17,18)时,它将跳到(17,33)。当n为3时,第一个输出为(0,1,2),然后跳到(0,17,33)。由更多迭代工具提供的消耗法允许向前移动多个元素。在这里,它的使用方式如下:
consume(iterable, 20) # skipping 20 steps ahead我设法获得了输出中的两个元素的想要的行为:
steps = 0
for i, out in enumerate(output):
for j, index in enumerate(index_list):
if out <= index:
break
try:
if output[i + 1] <= index_list[j]:
steps = steps + index_list[j] - output[i + 1]
except:
pass
consume(iterable, steps)但是对于3个或更多的元素,步骤的数量不再被正确地计算。它必须乘以一些价值,但我不知道从哪里得到它。另一个任务是,我不想检查每一个输出的间隔。当一个消费被执行时,它必须知道下一个消费指令何时会发生.有什么帮助吗?
发布于 2020-06-13 12:00:03
这段代码只有在n< 20 (因为在中静态嵌套的块数是限于20)时才能工作
k = 170
index_list = [16, 32, 48, 62, 76, 88, 100, 110, 120, 128, 136, 142, 148, 153, 158, 161, 164, 166]
def get_bound(x):
for i in range(len(index_list)):
if x <= index_list[i]:
return index_list[i]
return k
def valid_combs(i, n=None, comb=None):
n = n if n is not None else i
comb = comb or list(range(n))
if i == n:
for x in range(k):
comb[0] = x
yield from valid_combs(i - 1, n, comb)
elif i >= 1:
prev = comb[n - i - 1]
bound = get_bound(prev)
for x in list(range(bound + 1, k)):
comb[n - i] = x
yield from valid_combs(i - 1, n, comb)
else:
yield tuple(comb)
for n in range(1, k+1):
iterable = valid_combs(n)
for output in iterable:
print(output)https://stackoverflow.com/questions/62189582
复制相似问题