小编典典

Python中的二分搜索(二分法)

all

是否有一个库函数对列表/元组执行二进制搜索,如果找到则返回项目的位置,如果没有则返回“假”(-1、无等)?

我在bisect 模块中找到了
bisect_left/right
函数,但即使项目不在列表中,它们仍然返回一个位置。这对于他们的预期用途来说非常好,但我只想知道一个项目是否在列表中(不想插入任何东西)。

我想过使用bisect_left然后检查该位置的项目是否等于我正在搜索的项目,但这似乎很麻烦(而且我还需要检查该数字是否可以大于我列表中的最大数字)。如果有更好的方法我想知道。

编辑
澄清我需要这个做什么:我知道字典非常适​​合这个,但我试图保持尽可能低的内存消耗。我的预期用途是一种双向查找表。我在表中有一个值列表,我需要能够根据它们的索引访问这些值。如果该值不在列表中,我还希望能够找到特定值的索引或
None 。

为此使用字典将是最快的方法,但会(大约)使内存需求增加一倍。

我在问这个问题时认为我可能忽略了 Python 库中的某些内容。正如 Moe 建议的那样,我似乎必须编写自己的代码。


阅读 122

收藏
2022-06-30

共1个答案

小编典典

bisect_left查找p可以在给定排序范围内插入元素的第一个位置,同时保持排序顺序。这将是xifx存在于范围内的位置。如果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
2022-06-30