Python3如何基于元素值拆分扁平列表为子列表及代码异常原因
问题分析与解决
错误原因
核心问题出在lst=[[]]*(number_of_sublists+1)这行代码。Python中使用*运算符复制包含可变对象(如列表)的序列时,实际复制的是对象的内存引用,而非新建独立对象。你生成的lst中所有子列表本质都指向内存中的同一个列表,因此不管向哪个索引的子列表追加元素,所有子列表都会同步更新,最终出现三个子列表内容完全相同的错误结果。
修复方案
最小改动原有代码的方案
仅修改子列表初始化逻辑,用列表推导式生成独立的空列表即可:
arr = [1,-1,4,-1,4,2] number_of_sublists = arr.count(-1) # 列表推导式会每次循环新建一个独立的空列表 lst = [[] for _ in range(number_of_sublists + 1)] idx = 0 for i in arr: if i == -1: idx += 1 else: lst[idx].append(i) print(lst) # 输出[[1], [4], [4, 2]]
更简洁的通用实现
无需提前统计-1的数量,遍历过程中动态生成子列表:
arr = [1,-1,4,-1,4,2] res = [] current_sublist = [] for num in arr: if num == -1: res.append(current_sublist) current_sublist = [] else: current_sublist.append(num) # 遍历结束后加入最后一段未收尾的子列表 res.append(current_sublist) print(res) # 输出[[1], [4], [4, 2]]
内容的提问来源于stack exchange,提问作者mihdas
相关产品推荐
相关产品推荐

