Python 中的二分查找(二分查找)

2023-12-06

是否有一个库函数可以对列表/元组执行二分搜索,如果找到则返回该项目的位置,如果没有则返回“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(使用前将#替换为@)

Python 中的二分查找(二分查找) 的相关文章

随机推荐