itertools.combinations:在间隔内多次消费

问题描述 投票:2回答:1
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个或更多元素,不再正确地计算步数。它必须乘以某个值,但我不知道从哪里得到它。另一个任务是,我不想检查每个输出的间隔。执行消费时,必须以某种方式已经知道何时将发生下一条消费指令。有什么帮助吗?

python python-3.x itertools
1个回答
1
投票

此代码仅在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)
    
© www.soinside.com 2019 - 2024. All rights reserved.