You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 22:15:03