如何实现按正负值变化拆分列表为子列表?需求及代码求助
解决按正负值变化拆分列表的问题
看起来你需要把一个列表按照正负值的变化节点来拆分成子列表——也就是每当元素从正值变为负值(或者反过来)时,就新建一个子列表。我来给你提供一个清晰的Python实现方案,还会帮你解释逻辑。
先明确需求示例
假设输入列表:
[3, 5, -2, -1, 4, 6, -7, -8, 9]
期望输出:[[3, 5], [-2, -1], [4, 6], [-7, -8], [9]]
实现代码
def split_by_sign_change(input_list): # 处理空列表的边界情况 if not input_list: return [] # 初始化结果列表,第一个子列表先放入第一个元素 result = [[input_list[0]]] # 从第二个元素开始遍历 for num in input_list[1:]: # 获取当前最后一个子列表的最后一个元素,用来判断符号变化 last_element = result[-1][-1] # 判断当前元素和上一个元素的符号是否一致 same_sign = (num > 0 and last_element > 0) or (num < 0 and last_element < 0) if same_sign: # 符号相同,加入当前子列表 result[-1].append(num) else: # 符号不同,新建子列表 result.append([num]) return result # 测试一下 test_list = [3, 5, -2, -1, 4, 6, -7, -8, 9] print(split_by_sign_change(test_list)) # 输出:[[3, 5], [-2, -1], [4, 6], [-7, -8], [9]]
代码逻辑解释
- 边界处理:先判断输入列表是否为空,避免后续索引报错;
- 初始化结果:把列表的第一个元素作为第一个子列表的起点;
- 遍历判断:逐个检查后续元素,和当前最后一个子列表的最后一个元素比较符号:
- 如果符号相同,就把当前元素加入这个子列表;
- 如果符号不同,就新建一个子列表来存放当前元素;
- 返回结果:遍历完成后,就得到了按正负变化拆分好的列表列表。
特殊情况说明
如果你的列表里包含0,需要先明确0的处理规则:
- 如果想把
0和正数归为一类,可以把判断条件改成:(num >= 0 and last_element >= 0) or (num < 0 and last_element < 0); - 如果想把
0单独拆分成子列表,可以额外增加一个判断分支,单独处理0的情况。
内容的提问来源于stack exchange,提问作者user8925318
相关产品推荐
相关产品推荐

