如何查找列表中最后一个小于指定比较日期的datetime.date对象的索引
方案1:列表为升序排列时(你的示例符合该场景)
直接用Python标准库bisect模块实现,代码极简且时间复杂度为O(logn),列表元素越多性能优势越明显:
import datetime import bisect dates = [datetime.date(2020, 2, 1), datetime.date(2021, 2, 1), datetime.date(2022, 2, 1), datetime.date(2023, 2, 1), datetime.date(2024, 2, 1), datetime.date(2025, 2, 1)] comparison_date = datetime.date(2022, 11, 5) # 找到比较日期的插入位置,减1即为最后一个小于比较日期的元素索引 last_index = bisect.bisect_left(dates, comparison_date) - 1 print(last_index)
运行结果为2,符合你的需求。如果返回值为-1说明列表中没有早于比较日期的元素。
方案2:列表为无序排列时
逆序遍历找到第一个符合条件的元素直接返回,不需要存储所有符合条件的索引,比你原方案更省内存、遍历耗时更短:
import datetime dates = [datetime.date(2020, 2, 1), datetime.date(2021, 2, 1), datetime.date(2022, 2, 1), datetime.date(2023, 2, 1), datetime.date(2024, 2, 1), datetime.date(2025, 2, 1)] comparison_date = datetime.date(2022, 11, 5) last_index = -1 for idx, date in enumerate(reversed(dates)): if date < comparison_date: last_index = len(dates) - 1 - idx break print(last_index)
内容的提问来源于stack exchange,提问作者quadratecode
相关产品推荐
相关产品推荐

