Python处理相邻同值日期值对列表 仅保留最早日期的方案优化
优化思路与实现方案
首先明确需求核心:仅合并连续相邻的同数值条目,每组连续同值条目保留最早日期的条目,非连续同值条目互不影响。
现有方案可优化点
get_dates_1做了两次列表反转操作,存在不必要的性能开销,同时会修改原输入列表,如果外部还有其他引用会产生副作用get_dates_2增加了排序逻辑,如果输入列表本身已经按日期升序排列(通常这类时间序列数据都是预先排好序的),排序属于冗余操作,会把时间复杂度从O(n)拉高到O(nlogn)
最优优雅实现
Python 内置的itertools.groupby刚好适配这个场景:它会把连续的、key相同的元素分为一组,我们只要对每组取第一个元素的日期即可,完全匹配需求。
import datetime import itertools def get_dates_optimized(input_list): # 如果输入列表不确定是否按日期排序,先加下面这行排序 # input_list = sorted(input_list, key=lambda x: x[0]) # 按连续相同的数值分组,每组取第一个元素的日期 return [next(group)[0] for _, group in itertools.groupby(input_list, key=lambda x: x[1])]
测试验证
用你给出的第一个测试用例验证:
l = [[datetime.datetime(2021, 1, 1, 0, 0), 0], [datetime.datetime(2021, 3, 1, 0, 0), 0], [datetime.datetime(2021, 4, 1, 0, 0), 2], [datetime.datetime(2021, 8, 1, 0, 0), 0], [datetime.datetime(2021, 10, 1, 0, 0), 5]] print(get_dates_optimized(l))
输出完全符合预期:
[datetime.datetime(2021, 1, 1, 0, 0), datetime.datetime(2021, 4, 1, 0, 0), datetime.datetime(2021, 8, 1, 0, 0), datetime.datetime(2021, 10, 1, 0, 0)]
无依赖简化实现
如果不想引入itertools依赖,也可以简化正向遍历的写法,避免边界判断冗余:
def get_dates_simple(input_list): if not input_list: return [] res = [input_list[0][0]] prev_val = input_list[0][1] for date, val in input_list[1:]: if val != prev_val: res.append(date) prev_val = val return res
这个写法不需要修改原列表,也没有多余的反转、排序操作,时间复杂度O(n),空间复杂度除了结果存储仅需O(1),可读性也很高。
内容的提问来源于stack exchange,提问作者venv
相关产品推荐
相关产品推荐

