如何用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
错误代码的问题分析
- 嵌套Lambda未执行遍历:内层lambda仅定义了函数逻辑,但没有对
range(len(S)-1)的元素进行实际计算,map返回的是包含(lambda函数、range对象)的元组列表,完全没做有效判断。 - 逻辑判断完全反转:原代码是当元素不相邻(
S[j] != S[j+1])时才记录该元素,错误代码里却写成S[j] == S[j+1]才返回元素,逻辑完全搞反。 - 无效值处理错误:用字符串"None"作为不符合条件的返回值,会导致
max计算时出现类型错误(字符串与数字无法比较),且"None"本身不是有效的候选值。 - 遍历范围缺失:原代码遍历所有唯一元素,错误代码用
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不等于第二个索引,说明元素非相邻出现);
- 收集所有符合条件的元素,取最大值;若没有符合条件的元素,
max的default参数会返回0。
内容的提问来源于stack exchange,提问作者Nooboolean
相关产品推荐
相关产品推荐

