Python: 创建一个有序数字范围,跳过每N到N+D个数字的逆序
大家好,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 个回答
在编程中,有时候我们会遇到一些问题,想要找到解决办法。比如,有人可能在使用某个工具或库的时候,发现它的功能不太符合自己的需求。这时候,他们就会在网上寻求帮助,比如在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
在编程中,有时候我们需要处理一些数据,比如从一个地方获取信息,然后在另一个地方使用这些信息。这个过程就像是把水从一个水桶倒到另一个水桶里。
但是,有些时候我们会遇到一些问题,比如数据的格式不对,或者我们想要的数据没有被正确地获取到。这就像是你想要的水桶里没有水,或者水的颜色不对。
为了避免这些问题,我们可以使用一些工具和方法来确保我们获取到的数据是正确的。这就像是使用一个过滤器来确保水是干净的,或者使用一个量杯来确保我们倒出的水量是准确的。
总之,在处理数据时,我们需要小心谨慎,确保每一步都做得正确,这样才能得到我们想要的结果。
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]
这个生成器怎么样呢?它使用了模运算:
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]