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

如何简化按连续正负分组求和的整数列表压缩函数?

简化整数列表按连续正负分组求和的实现

嘿,这个问题我太懂了!循环结束后还要手动补最后一组的代码确实显得冗余,其实有几种简洁的方式可以解决,既避免重复代码,又让逻辑更清晰。

先明确下需求示例(方便大家理解):

输入:[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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:09:42