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
相关产品推荐
相关产品推荐

