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]
.
如果我有以下代码...
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]
.