0

我试图理解这段代码:

i = bisect.bisect(self.A, [id + 1]) - 1

在这里,开发人员传入[id + 1]bisect()as x(目标值)。在Python 文档及其bisect 的源代码中,我没有看到任何提到的x可以是长度为 1 的数组的地方。

代码的目标是查找A具有id或最大 id in的元组的值A。例如:

A = [[0, 0], [2, 4]]
id = 1
Output = 0 // Here: 1 isn't in A so return value 0 from id 0 which is the biggest id < input id
A = [[0, 0], [2, 4], [3, 12]]
id = 3
Output = 12 // 3 is in A so return 12

我尝试取出ids以尝试查找该值,但我的代码返回错误答案:

A = [[0, 0], [2, 4]]
id = 1
ids = [0, 2]
i = bisect.bisect(ids, id) // return 1 which is correct for bisect but not the expected result
i = bisect.bisect(ids, id + 1) - 1 // still returns 1
i = bisect.bisect_left(ids, id + 1) - 1 // still returns 1
i = bisect.bisect_left(ids, id + 1) - 1 // returns 0

但是,bisect_left()将返回错误的答案:

A = [[0, 0], [2, 4], [3, 12]] 
id = 3
i = bisect.bisect(self.A, [id + 1]) - 1 // returns 12 which is correct
ids = [0, 2, 3]
i = bisect.bisect_left(ids, id + 1) - 1 // returns 4 

那么为什么会有区别呢?传递是如何[x]工作的?

4

1 回答 1

1

list以 a作为参数进行二等分没有特殊情况。lists 可以像其他任何东西一样进行比较,并且比较是按字典顺序排列的。因此,如果您[id + 1]在slist的两个元素list中搜索int,您会找到内部作为第一个元素的list位置id+1。通过比两个元素短list,它总是小于具有相同第一个元素的任何东西,因此bisect_left将相对于相等元素给出一致的位置,总是在相等元素运行的最开始(而如果你通过了[id + 1, 0],你会追随第二个int为负数的任何元素)。

于 2021-01-19T16:31:00.867 回答