首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >itertools.combinations:间隔消耗多次

itertools.combinations:间隔消耗多次
EN

Stack Overflow用户
提问于 2020-06-04 07:56:43
回答 1查看 415关注 0票数 2
代码语言:javascript
复制
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)。由更多迭代工具提供的消耗法允许向前移动多个元素。在这里,它的使用方式如下:

代码语言:javascript
复制
consume(iterable, 20)    # skipping 20 steps ahead

我设法获得了输出中的两个元素的想要的行为:

代码语言:javascript
复制
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个或更多的元素,步骤的数量不再被正确地计算。它必须乘以一些价值,但我不知道从哪里得到它。另一个任务是,我不想检查每一个输出的间隔。当一个消费被执行时,它必须知道下一个消费指令何时会发生.有什么帮助吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-13 12:00:03

这段代码只有在n< 20 (因为在中静态嵌套的块数是限于20)时才能工作

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62189582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档