如何生成交替范围?

6 投票
7 回答
1264 浏览
提问于 2025-04-16 09:15

我需要在一个列表中,根据给定的索引和半径来查找某个项目。目前,我使用这个函数来生成交替的偏移量进行搜索:

def generateSearchIndizes(radius):
    for i in range(1, radius + 1):
        yield i
        yield -i

进行搜索的代码大致是这样的:

for i in generateSearchIndizes():
    if pred(myList[baseIndex + i]):
        result = myList[baseIndex + i]
        break # terminate search when first item is found

我想问的是,有没有更简洁的方法来生成搜索的索引,也许不需要定义一个特别的函数?

7 个回答

0

为什么要交替使用 -i 和 i?直接这样做就可以了:

for i in range(-radius, radius+1):
    listitem = myList[baseIndex + i]
        if pred(listitem):
            return listitem  

或者如果你真的需要从前后两个方向来获取最外层的匹配器,那这样做怎么样:

for i in sorted(range(-radius, radius+1), key=abs):
    listitem = myList[baseIndex + i]
        if pred(listitem):
            return listitem  

如果你经常需要这样做,建议你先构建一个 sorted(range(-radius,radius+1),key=abs),然后把它保存起来,以便以后使用。

如果你真的不想使用第0个元素,可以在循环开始时加一句 if not i: continue

2

这是我对这个问题的尝试:

from itertools import chain

>>> list(chain(*zip(range(1, 7), range(-7, 0)[::-1])))
[1, -1, 2, -2, 3, -3, 4, -4, 5, -5, 6, -6]

根据需要进行调整哦。 :)

4

有没有更优雅的方法来生成搜索索引呢?

我觉得没有更优雅的方法了。你的代码非常简单明了。

也许可以不定义一个特殊的函数?

是的,这绝对是可能的。

>>> [b for a in ((x,-x) for x in range(1, 10 + 1)) for b in a]
[1, -1, 2, -2, 3, -3, 4, -4, 5, -5, 6, -6, 7, -7, 8, -8, 9, -9, 10, -10]

撰写回答