根据我的理解,bisect_left和bisect_right是做同样事情的两种不同方式:二分法,一个来自左边,另一个来自右边。因此,它们具有相同的结果。假设列表和被搜索的值是相同的,在什么情况下这两者不相等,即什么时候它们会返回不同的结果?
答案 0 :(得分:31)
bisect.bisect_left
返回排序列表中最左边的位置以插入给定元素。
bisect.bisect_right
返回排序列表中最右边的位置以插入给定元素。
另一个问题是它们何时相同?通过回答这个问题,你的问题的答案就变得清晰了。
当要插入的元素不在列表中时,它们是等效的。因此,当要插入的元素在列表中时,它们不等效。
答案 1 :(得分:17)
当要查找的目标位于列表中时,bisect_left
,bisect_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.bisect
和bisect.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
将在相同元素的右边插入元素。