如何简化按连续正负分组求和的整数列表压缩函数?
简化整数列表按连续正负分组求和的实现
嘿,这个问题我太懂了!循环结束后还要手动补最后一组的代码确实显得冗余,其实有几种简洁的方式可以解决,既避免重复代码,又让逻辑更清晰。
先明确下需求示例(方便大家理解):
输入:
[1, 2, -3, -4, 5, -6, -7, -8]
输出:[3, -7, 5, -21]
方法一:优化遍历逻辑,避免重复块
核心思路是跟踪当前组的状态(符号和总和),只在组切换时将之前的总和存入结果,最后统一处理剩余组——这样就不会有重复的代码片段:
def compress_list(nums): # 先处理空列表的边界情况 if not nums: return [] result = [] current_sum = nums[0] # 用布尔值标记当前组的正负(True为正,False为负) current_sign = current_sum > 0 for num in nums[1:]: num_sign = num > 0 if num_sign == current_sign: # 同组,累加 current_sum += num else: # 切换组,先把当前组的总和存入结果 result.append(current_sum) # 初始化新组的状态 current_sum = num current_sign = num_sign # 遍历结束后,把最后一组的总和加入结果(这一步只需要写一次) result.append(current_sum) return result
这个写法里,所有组的处理逻辑都是统一的:只有组切换时才输出上一组,最后补一次即可,没有重复的代码块,逻辑非常连贯。
方法二:用itertools.groupby一行搞定(Pythonic风格)
如果想追求极致简洁,可以直接用Python标准库的itertools.groupby,它天生就是用来处理相邻重复元素分组的场景:
from itertools import groupby def compress_list(nums): # 按元素的正负作为分组键,对每组求和 return [sum(group) for _, group in groupby(nums, key=lambda x: x > 0)]
这里的groupby会自动把相邻的、正负性相同的元素分成一组,我们只需要对每个分组求和即可。完全不用手动处理最后一组,因为groupby会遍历完所有元素,代码量直接压缩到一行。
边界情况测试
两种方法都能完美处理以下场景:
- 空列表:
compress_list([])返回[] - 单元素列表:
compress_list([-5])返回[-5] - 全正/全负列表:
compress_list([1,2,3])返回[6]
内容的提问来源于stack exchange,提问作者jxie0755
相关产品推荐
相关产品推荐

