Python: 创建一个有序数字范围,跳过每N到N+D个数字的逆序

2 投票
3 回答
2321 浏览
提问于 2025-04-18 01:06

大家好,StackOverflow的朋友们。今晚我决定来点刺激的,玩玩循环语句,遍历我创建的一个列表。

不过看起来这个派对有点不顺利,因为我想要创建一个数字范围的方法并不明显,无论是通过查资料还是自己尝试,都让我感到困扰。

我的需求是:我想创建一个数字范围,方式和通常的范围创建方法差不多... 就是用range(start, stop, step)来指定范围,但我想稍微改动一下,能额外指定一个步长的“扫过”值,这样的话,范围的表现就像是range(start, stop, step:sweep)一样。

也就是说,如果上面这个很棒的函数存在的话,我可以这样使用它:

range(0,16,3:5)
# [0,3,4,5,8,9,10,13,14,15]

再来一个例子!

range(0,24,2:9)
# [0,2,3,4,5,6,7,8,9,11,12,13,14,15,16,17,18,20,21,22,23]

还有一个!

range(0,24,3:9)
# [0,3,4,5,6,7,8,9,12,13,14,15,16,17,18,21,22,23]

最后一个。

swept_range(5,20,3,4)
# [7, 8, 11, 12, 15, 16, 19]

简单来说,我想要一个简单的方法来创建一系列有序的数字,能够保留每N个到N+D个数字的组,其中D是一个正数。

我尝试过切片,但没有成功。

我知道MATLAB可以很简洁地做到这一点,但不确定Python中是否有类似的功能——有没有人知道呢?

3 个回答

1

在编程中,有时候我们会遇到一些问题,想要找到解决办法。比如,有人可能在使用某个工具或库的时候,发现它的功能不太符合自己的需求。这时候,他们就会在网上寻求帮助,比如在StackOverflow上提问。

在提问的时候,最好能把问题描述得清楚一些,包含你遇到的具体情况、你尝试过的解决方法,以及你希望得到的结果。这样,其他人才能更容易理解你的问题,并给出有效的建议。

总之,提问的方式很重要,清晰的表达能帮助你更快找到答案。

def srange(start, stop, step=1, sweep=0):
    if sweep < 0 :
        raise Exception("sweep needs to be positive.")
    STEPPING = 0
    SWEEPING = 1
    state = STEPPING
    next = start
    res = []
    while next < stop:
             res.append(next)

             #ignores state if sweep is 0
             if state == STEPPING or sweep == 0 :
                        state = SWEEPING
                        next = next + step
             elif state == SWEEPING :
                        next = next + 1      
                        if next % sweep == 0:
                                 state = STEPPING
    return res
2

在编程中,有时候我们需要处理一些数据,比如从一个地方获取信息,然后在另一个地方使用这些信息。这个过程就像是把水从一个水桶倒到另一个水桶里。

但是,有些时候我们会遇到一些问题,比如数据的格式不对,或者我们想要的数据没有被正确地获取到。这就像是你想要的水桶里没有水,或者水的颜色不对。

为了避免这些问题,我们可以使用一些工具和方法来确保我们获取到的数据是正确的。这就像是使用一个过滤器来确保水是干净的,或者使用一个量杯来确保我们倒出的水量是准确的。

总之,在处理数据时,我们需要小心谨慎,确保每一步都做得正确,这样才能得到我们想要的结果。

def yrange(st, sp, N, D):
    return [st] + [j for i in range(st,sp,D) for j in range(i+N,i+D+1) if j < sp]

print yrange(0, 16, 3, 5)
# [0, 3, 4, 5, 8, 9, 10, 13, 14, 15]
print yrange(0, 24, 2, 9)
# [0, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23]
print yrange(0, 24, 3, 9)
# [0, 3, 4, 5, 6, 7, 8, 9, 12, 13, 14, 15, 16, 17, 18, 21, 22, 23]
2

这个生成器怎么样呢?它使用了模运算:

def swept_range(start, stop, step=1, sweep=1):
    for i in range(start, stop):
        if not 0 < i % sweep < step:
            yield i

如果你需要一个序列,而不是一个迭代器,你也可以使用列表推导式:

def swept_range(start, stop, step=1, sweep=1):
    return [i for i in range(start, stop) if not 0 < i % sweep < step]

撰写回答