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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 03:15:40