如何使用functools.reduce重写连续同年份记录检查函数
用functools.reduce重写连续年份检查函数
现有一个函数,接收字典列表作为输入,功能是检查列表中是否存在连续5条年份相同的记录。原函数的实现如下:
def is_poorly_mixed_reduce(partition): cnt = 0 prev_year = None for d in partition: curr_year = d["date"][:4] if curr_year == prev_year: cnt += 1 if cnt == 5: return True else: cnt = 1 prev_year = curr_year return False
需要用functools.reduce重写该函数,以下是分区数据示例:
[ {'user_id': 452355, 'recipe_id': 292657, 'date': '2016-05-08'}, {'user_id': 3213, 'recipe_id': 21321, 'date': '2015-05-08'}, {'user_id': 32145, 'recipe_id': 321, 'date': '2013-12-10'}, {'user_id': 54366, 'recipe_id': 98745, 'date': '2012-12-10'}, {'user_id': 23483, 'recipe_id': 498298, 'date': '2010-11-01'} ]
重写后的实现
利用functools.reduce的累积特性,我们通过维护一个包含检查状态的累积器来实现逻辑:
from functools import reduce def is_poorly_mixed_reduce(partition): def reducer(acc, record): # 已找到连续5条记录,直接返回当前状态 if acc["found"]: return acc curr_year = record["date"][:4] prev_year, current_count = acc["prev_year"], acc["count"] if curr_year == prev_year: updated_count = current_count + 1 # 连续计数达到5,标记为已找到 if updated_count == 5: return {"found": True, "prev_year": curr_year, "count": updated_count} return {"found": False, "prev_year": curr_year, "count": updated_count} else: # 年份不同,重置计数 return {"found": False, "prev_year": curr_year, "count": 1} # 初始状态:未找到、无上一年份、计数为0 initial_state = {"found": False, "prev_year": None, "count": 0} final_state = reduce(reducer, partition, initial_state) return final_state["found"]
逻辑说明
- 累积器
acc是一个字典,跟踪三个核心状态:found(是否已找到连续5条记录)、prev_year(上一条记录的年份)、count(当前连续年份的计数)。 - 每次处理记录时,先判断是否已经找到目标,若是则直接返回当前状态,避免多余计算。
- 对比当前记录年份与上一年份:年份相同则计数加1,达到5则标记
found为True;年份不同则重置计数为1。 - 最后返回累积结果中的
found值,即为最终检查结果。
测试上述示例数据时,由于所有记录年份均不重复,函数会返回False,符合预期。
内容的提问来源于stack exchange,提问作者petrashin_nikita
相关产品推荐
相关产品推荐

