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

如何用Lambda替代For循环实现原函数功能并保持函数式编程?

问题:用函数式风格实现查找列表中非相邻出现的最大元素

需求说明

实现功能:查找列表中非相邻出现的最大元素。输入列表长度为偶数,每个元素仅出现2次;若无符合条件的元素,返回0。

原实现代码

def cage_cats(S): 
    maxtemp = 0
    temp = list(set(S))
    for i in range(len(temp)-1):
        for j in range(len(S)-1):
            if temp[i] == S[j]:
                if S[j] == S[j+1]:
                    break
                else:
                    maxtemp = max(S[j], maxtemp)

    return maxtemp 

错误的函数式改写尝试

def cage_cats(S):
    temp = list(set(S))
    maxtemp = max(
        list(
            map(
                lambda i : (
                    lambda j : (
                        S[j] if temp[i] == S[j] and S[j] == S[j+1] else "None"
                    ),range(len(S)-1)
                ),range(len(temp)-1)
            )
        )
    , 0)

示例输入输出

  • 输入[1, 1, 2, 2, 5, 3, 3, 5],预期输出5
  • 输入[1, 2, 2, 3, 1, 5, 5, 3],预期输出3
  • 输入[1, 1, 2, 2, 3, 3],预期输出0

错误代码的问题分析

  1. 嵌套Lambda未执行遍历:内层lambda仅定义了函数逻辑,但没有对range(len(S)-1)的元素进行实际计算,map返回的是包含(lambda函数、range对象)的元组列表,完全没做有效判断。
  2. 逻辑判断完全反转:原代码是当元素不相邻(S[j] != S[j+1])时才记录该元素,错误代码里却写成S[j] == S[j+1]才返回元素,逻辑完全搞反。
  3. 无效值处理错误:用字符串"None"作为不符合条件的返回值,会导致max计算时出现类型错误(字符串与数字无法比较),且"None"本身不是有效的候选值。
  4. 遍历范围缺失:原代码遍历所有唯一元素,错误代码用range(len(temp)-1)少遍历了最后一个元素,可能漏掉符合条件的最大值。

正确的函数式实现

写法一:结合filter、lambda与max

def cage_cats(S):
    # 获取元素的两个出现位置
    get_indices = lambda num: [idx for idx, val in enumerate(S) if val == num]
    # 判断元素是否非相邻出现
    is_non_adjacent = lambda num: get_indices(num)[0] + 1 != get_indices(num)[1]
    # 筛选所有符合条件的元素
    valid_numbers = list(filter(is_non_adjacent, set(S)))
    # 返回最大值,无符合元素则返回0
    return max(valid_numbers, default=0)

写法二:字典推导式+列表推导式

def cage_cats(S):
    # 用字典记录每个元素的两个索引
    element_positions = {
        num: [idx for idx, val in enumerate(S) if val == num]
        for num in set(S)
    }
    # 筛选非相邻的元素
    valid_numbers = [
        num for num, indices in element_positions.items()
        if indices[0] + 1 != indices[1]
    ]
    return max(valid_numbers, default=0)

逻辑说明

  1. 先为每个唯一元素记录它在列表中的两个出现索引;
  2. 判断这两个索引是否不连续(即第一个索引+1不等于第二个索引,说明元素非相邻出现);
  3. 收集所有符合条件的元素,取最大值;若没有符合条件的元素,max的default参数会返回0。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 13:16:14