我有一个日期的排序列表,我正在寻找一种方法来找到输入日期在该排序列表中的位置,但更具体地说是它的上界。
例如,如果在排序的日期列表中,它的[0, 1, 2, 3, 4, 5]
位置,然后输入日期在位置3和4之间,我希望函数将位置4返回给我。
是否有一个预先做的二进制搜索等我可以使用这个?还是我自己写?
最佳答案
您可以使用bisect.bisect_left()
或bisect.bisect_right()
(别名为bisect.bisect()
)来查找插入点。使用二进制搜索,最多可以在log N步骤中找到这一点。
不同之处在于当你给它一个date()
时会发生什么,这个bisect_left()
是在列表本身中的;bisect_right()
会给这个值本身的索引,会给它后面的索引。
演示:
>>> import bisect
>>> list_of_dates = [
... date(2015, 1, 15), date(2015, 2, 1), date(2015, 3, 31),
... date(2015, 4, 25), date(2015, 5, 23), date(2015, 6, 11)]
>>> bisect.bisect(list_of_dates, date(2015, 4, 30))
4
>>> bisect.bisect(list_of_dates, date(2015, 4, 25))
4
>>> bisect.bisect_left(list_of_dates, date(2015, 4, 25))
3