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-method允许将多个元素向前移动。在这里它会像这样使用:
consume(iterable, 20) # skipping 20 steps ahead
我已对其进行管理,以获取输出中2个元素的所需行为:
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个或更多元素,不再正确地计算步数。它必须乘以某个值,但我不知道从哪里得到它。另一个任务是,我不想检查每个输出的间隔。执行消费时,必须以某种方式已经知道何时将发生下一条消费指令。有什么帮助吗?
此代码仅在n <20]时有效(因为Python中静态嵌套的块数为limited to 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)