如何在 Python 中的排序日期列表中找到特定日期介于两者之间的日期?
How to find in a sorted list of dates where a specific date lies in between, in Python?
我有一个排序的日期列表,我正在寻找一种方法来查找输入日期在该排序列表中的位置,但更具体地说是它的上限。
例如如果在排序的日期列表中定位其 [0, 1, 2, 3, 4, 5]
,然后输入日期在位置 3 和 4 之间,我希望函数 return 位置 4 给我。
是否有预制的二进制搜索等我可以使用?还是我必须自己写?
您可以使用 bisect.bisect_left()
or 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
我有一个排序的日期列表,我正在寻找一种方法来查找输入日期在该排序列表中的位置,但更具体地说是它的上限。
例如如果在排序的日期列表中定位其 [0, 1, 2, 3, 4, 5]
,然后输入日期在位置 3 和 4 之间,我希望函数 return 位置 4 给我。
是否有预制的二进制搜索等我可以使用?还是我必须自己写?
您可以使用 bisect.bisect_left()
or 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