是否有一个库函数可以对列表/元组执行二分搜索,如果找到则返回该项目的位置,如果没有则返回“False”(-1、None 等)?
我在中找到了函数 bisect_left/right对分模块,但即使该项目不在列表中,它们仍然返回一个位置。这对于他们的预期用途来说非常好,但我只想知道列表中是否有某个项目(不想插入任何内容)。
我想用bisect_left
然后检查该位置的项目是否等于我正在搜索的项目,但这似乎很麻烦(而且我还需要进行边界检查该数字是否可以大于列表中的最大数字)。如果有更好的方法我想知道。
Edit为了澄清我需要这个的目的:我知道字典非常适合于此,但我试图将内存消耗保持在尽可能低的水平。我的预期用途是一种双向查找表。我在表中有一个值列表,我需要能够根据索引访问这些值。而且我还希望能够找到特定值的索引,或者如果该值不在列表中则找不到索引。
为此使用字典将是最快的方法,但会(大约)使内存需求增加一倍。
我问这个问题时认为我可能忽略了 Python 库中的某些内容。看来我必须按照 Moe 的建议编写自己的代码。
bisect_left
找到第一个位置p
可以将元素插入给定的排序范围,同时保持排序顺序。这将是x
if x
存在于范围内。如果p
是过去结束的位置,x
没有找到。否则,我们可以测试一下是否x
在那里看看是否x
被找到。
from bisect import bisect_left
def binary_search(a, x, lo=0, hi=None):
if hi is None: hi = len(a)
pos = bisect_left(a, x, lo, hi) # find insertion position
return pos if pos != hi and a[pos] == x else -1 # don't walk off the end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)