谁能帮我解释一下为什么第一个和第二个返回不同的结果?我认为第二个也应该返回2。
In [15]: bisect.bisect([0,3], 3)
Out[15]: 2
In [16]: bisect.bisect([[0, 0], [3, 50]], [3])
Out[16]: 1
裁判:https://docs.python.org/3/tutorial/datastructures.html comparing-sequences-and-other-types
详细答案:
指定的命令返回在列表a中插入项x的索引,并保持顺序,假设a已排序。
为了计算这个位置,执行一个二进查找,并且在每次迭代中比较列表中的值和要插入的值。
我注意到的第一个区别是,在第一个示例中,您提供了一个数字列表和一个要输入的数值。在第二种情况下,它是一个列表的列表,以及一个要插入的列表。
这会影响比较的结果,特别是在将给定值与列表的索引1进行比较时。
对于数字列表,我们有[0,3]和3,所以对索引1的比较是:3 <3,返回False。
对于列表的列表,我们有[[0,0],[3,50]]和[3],索引1中的比较是[3]<[3, 50]。
比较列表遵循一种稍微不同的方法,遵循字典顺序,如https://docs.python.org/3/tutorial/datastructures.html#comparing-sequences-and-other-types所示。
在[3]的情况下,它是[3,50]的子序列,因此比较[3]的结果<[3,50]返回True。
从您链接的文档:
如果一个序列是另一个序列的初始子序列,则较短的序列是较小(较小)的序列。
这基本上与字典排序单词的方式相同(是一本书,而不是Pythondict
)。在其他条件相同的情况下,较短的序列被认为小于较长的序列。因此,[3]
在[3, 50]
之前。