如何生成交替范围?
我需要在一个列表中,根据给定的索引和半径来查找某个项目。目前,我使用这个函数来生成交替的偏移量进行搜索:
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]