bisect_left和bisect_right何时不相等?

时间:2013-11-30 06:18:04

标签: python python-2.7

根据我的理解,bisect_left和bisect_right是做同样事情的两种不同方式:二分法,一个来自左边,另一个来自右边。因此,它们具有相同的结果。假设列表和被搜索的值是相同的,在什么情况下这两者不相等,即什么时候它们会返回不同的结果?

5 个答案:

答案 0 :(得分:31)

bisect.bisect_left返回排序列表中最左边的位置以插入给定元素。 bisect.bisect_right返回排序列表中最右边的位置以插入给定元素。

另一个问题是它们何时相同?通过回答这个问题,你的问题的答案就变得清晰了。

当要插入的元素不在列表中时,它们是等效的。因此,当要插入的元素在列表中时,它们不等效。

答案 1 :(得分:17)

当要查找的目标位于列表中时,bisect_leftbisect_right会返回不同的结果。

例如:

>>> import bisect
>>> bisect.bisect_left([1,2,3], 2)
1
>>> bisect.bisect_right([1,2,3], 2)
2

答案 2 :(得分:7)

正如其他人所指出的那样, bisect_left bisect_right 会在列表中显示正在查找的元素时返回不同的结果。

事实证明 bisect_left 在手头更有用,因为它返回了列表中存在的元素的确切索引。

>>> import bisect
>>> bisect.bisect_left([1,2,3,4,5], 2)
1

使用bisect_left的 binary_search 示例:

from bisect import bisect_left

def binsearch(l,e):
    '''
    Looks up element e in a sorted list l and returns False if not found.
    '''
    index = bisect_left(l,e)
    if index ==len(l) or l[index] != e:
        return False
    return index

如果您想使用bisect_right而不是bisect_left并获得相同的结果,则上述代码会有一个小的变化。

答案 3 :(得分:2)

有两件事需要理解: bisect.bisectbisect.bisect_right的工作方式相同。它们返回可插入元素的最右侧位置。但与上述相反,bisect.bisect_left返回可插入元素的最左侧位置。小心使用。

答案 4 :(得分:0)

对我来说,对presentation / bisect_left的这种解释更加清楚:

  • bisect_right返回最大索引以插入元素w.r.t。 bisect_left
  • <返回最大索引以插入元素w.r.t。 bisect_right

例如,如果您的数据是<=,而您查询的是[0, 0, 0]

  • 0返回索引0,因为这是最大的插入索引,其中插入的元素确实较小。
  • bisect_left返回索引3,因为对于“小于或等于”的搜索将通过相同的元素进行。

此行为可以简化为:

  • bisect_right将在相同元素的左侧插入元素。
  • bisect_left将在相同元素的右边插入元素。