我有一个日期的排序列表,我正在寻找一种方法来找到输入日期在该排序列表中的位置,但更具体地说是它的上界。
例如,如果在排序的日期列表中,它的[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

10-04 21:59