【发布时间】:2010-09-17 18:17:14
【问题描述】:
是否有一个库函数对列表/元组执行二进制搜索,如果找到则返回项目的位置,如果没有则返回“假”(-1、无等)?
我在bisect module 中找到了 bisect_left/right 函数,但即使项目不在列表中,它们仍会返回一个位置。这对于他们的预期用途来说非常好,但我只想知道一个项目是否在列表中(不想插入任何东西)。
我想过使用bisect_left,然后检查该位置的项目是否等于我正在搜索的项目,但这似乎很麻烦(而且我还需要检查数字是否可以大于最大的我列表中的号码)。如果有更好的方法我想知道。
编辑为了澄清我需要这个做什么:我知道字典非常适合这个,但我试图保持尽可能低的内存消耗。我的预期用途是一种双向查找表。我在表中有一个值列表,我需要能够根据它们的索引访问这些值。而且我还希望能够找到特定值的索引,或者如果该值不在列表中,则为 None。
为此使用字典是最快的方法,但会(大约)使内存需求增加一倍。
我在问这个问题时认为我可能忽略了 Python 库中的某些内容。看来我必须按照 Moe 的建议编写自己的代码。
【问题讨论】:
-
你想要完成什么?如果值是唯一的,请考虑使用集合和“如果集合中的值:某物”。
-
对于它的价值,“-1”被认为是真实的; “0”是假的。
-
我提到 -1 是因为返回数组中搜索项的索引的函数已经可以返回 0,因此如果未找到该项,则返回 -1(类似于子字符串搜索)。跨度>
-
如果你使用 numpy,
np.searchsorted很有用。 docs.scipy.org/doc/numpy/reference/generated/…
标签: python binary-search bisection