Python 平分值 x 是一个长度为 1 的数组

Python bisect with value x is an array of length 1

我正在尝试理解这段代码:

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

这里,开发者在bisect()中传递了[id + 1]作为x(目标值)。在 Python docs and its source code for bisect 中,我没有看到任何地方提到 x 可以是长度为 1 的数组。

代码的目标是在 A 中找到具有 idA 中最大 id 的元组的值。例如:

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 来尝试找到值,但我的代码 return 的答案是错误的:

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() 将 return 给出错误答案:

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] 如何运作?

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