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

Python字典中日期数据按等值且连续规则分组的实现方案咨询

Python 按「值相等且日期连续」规则分组实现方案

实现思路

  • 首先对输入字典的键值对按日期升序排序,避免字典顺序不稳定的问题,保证后续遍历顺序正确
  • 单次遍历排序后的数据,仅维护当前分组的起始日期、结束日期、对应值三个状态,内存占用低
  • 每遍历到新元素时,判断是否同时满足「值与当前分组相等」「日期为当前分组结束日期的下一天」两个条件,满足则合并到当前分组,否则结束当前分组并开启新分组
  • 遍历完成后将最后一个分组补充到结果中,统一格式化日期为要求的字符串格式

完整实现代码

import datetime

def group_continuous_dates(input_data: dict[datetime.date, int]) -> list[dict]:
    # 处理空输入场景
    if not input_data:
        return []
    
    # 按日期升序排序所有键值对
    sorted_items = sorted(input_data.items(), key=lambda x: x[0])
    
    result = []
    # 初始化第一个分组参数
    current_from, current_val = sorted_items[0]
    current_to = current_from
    
    for date, val in sorted_items[1:]:
        # 校验连续且值相等的合并条件
        if val == current_val and date == current_to + datetime.timedelta(days=1):
            current_to = date
        else:
            # 不满足条件则归档当前分组,开启新分组
            result.append({
                "from_date": current_from.strftime("%Y-%m-%d"),
                "val": current_val,
                "to_date": current_to.strftime("%Y-%m-%d")
            })
            current_from = current_to = date
            current_val = val
    
    # 归档最后一个未处理的分组
    result.append({
        "from_date": current_from.strftime("%Y-%m-%d"),
        "val": current_val,
        "to_date": current_to.strftime("%Y-%m-%d")
    })
    return result

# 测试用例
if __name__ == "__main__":
    input_data = {
        datetime.date(2019, 1, 1): 2,
        datetime.date(2019, 1, 3): 2,
        datetime.date(2019, 1, 4): 2,
        datetime.date(2019, 1, 5): 9,
        datetime.date(2019, 1, 6): 10,
        datetime.date(2019, 1, 7): 10,
        datetime.date(2019, 1, 8): 10,
    }
    print(group_continuous_dates(input_data))

运行后输出结果完全符合要求,整体时间复杂度为O(n log n)(主要为排序开销,遍历过程为O(n)),可兼容空输入、单元素输入等边界场景。


内容的提问来源于stack exchange,提问作者SDRJ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 00:45:04