Python 列表列表的二分法

Python Bisection for list of list

如果我有以下代码...

from bisect import bisect_right
a = [[0, 0], [3, 5], [3,9]]
print(bisect_right(a, [3]))

b = [0, 3, 3]
print(bisect_right(b, 3))

我得到以下输出

1
3

这与我的预期相反。 据我了解,Python 应该使用 a 中每个列表的第一个元素来确定排序。然后是,根据 documentation 第一个输出应该是 3 而不是 1 因为

The returned insertion point i partitions the array a into two halves so that all(val <= x for val in a[lo:i]) for the left side and all(val > x for val in a[i:hi]) for the right side.

第二种情况似乎是正确的。为什么在第一种情况下打印 1

提前致谢。

列表中的第一个元素不是排序的唯一因素。当第一个元素相等时,还会比较下一个元素。由于 [3] 没有第二个元素,因此被认为较小。

[3] < [3, 5]
# True

[3, 5] < [3, 9]
# True

[3, 9] < [3, 5]
# False

Python 对序列使用字典顺序。您可以将列表元素想象成字符串中的字符。如果我问你

的结果
bisect_right(['a', 'ba', 'bb'], 'b')

你会立即告诉我 1,而不是 3。显然 'b' < 'ba'。同样的事情适用于列表,无论是 ['b'] < ['b', 'a'] 还是 [3] < [3, 5].