如何优化Python数组筛选代码?保留符合范围且前后3个元素达标的值
优化方案:简化逻辑并提升效率
原代码的核心问题在于重复判断元素范围和频繁修改列表导致的低效,嵌套循环加异常捕获的写法既繁琐又容易出错。下面提供两种更简洁高效的优化思路:
思路1:预处理标记+连续块分析
先一次性标记所有符合数值范围的元素,再通过分析连续符合条件的块,直接确定需要保留的元素位置,避免重复检查:
my_list = [0, 10, 20, 30, 40, 50, 52, 51, 49, 56, 44, 60, 70, 80, 55, 90] # 第一步:预处理,标记每个元素是否在40-60之间(不含边界) is_valid = [40 < num < 60 for num in my_list] n = len(is_valid) keep_indices = set() # 第二步:找出所有连续的有效块,确定其中符合条件的位置 start = 0 while start < n: # 定位连续有效块的起始点 while start < n and not is_valid[start]: start += 1 if start >= n: break # 定位连续有效块的结束点 end = start while end < n and is_valid[end]: end += 1 block_length = end - start # 只有块长度≥4时,才存在满足条件的元素 if block_length >= 4: # 后3个元素都有效:块中前 (block_length - 3) 个元素 for idx in range(start, start + block_length - 3 + 1): keep_indices.add(idx) # 前3个元素都有效:块中从第3个元素开始到结尾 for idx in range(start + 3, end): keep_indices.add(idx) start = end # 第三步:根据保留的索引生成结果 output_list = [my_list[i] for i in sorted(keep_indices)] print(output_list)
思路2:滑动窗口直接判断
利用滑动窗口一次性检查连续元素的有效性,直接标记需要保留的位置,逻辑更直观:
my_list = [0, 10, 20, 30, 40, 50, 52, 51, 49, 56, 44, 60, 70, 80, 55, 90] is_valid = [40 < num < 60 for num in my_list] n = len(my_list) keep = [False] * n # 遍历每个元素,检查是否满足"后3个都有效"或"前3个都有效" for i in range(n): # 检查后3个元素是否全部有效 if i + 3 < n and all(is_valid[i+1:i+4]): keep[i] = True # 检查前3个元素是否全部有效 if i - 3 >= 0 and all(is_valid[i-3:i]): keep[i] = True # 过滤出自身有效且符合保留条件的元素 output_list = [num for num, valid, should_keep in zip(my_list, is_valid, keep) if valid and should_keep] print(output_list)
优化点说明
- 避免重复计算:提前生成
is_valid数组,不用每次重复判断数值范围,减少冗余运算。 - 提升效率:通过标记索引或直接生成新列表,避免原代码中
pop操作带来的O(n²)时间复杂度(列表中间元素pop是O(n)级操作,多次执行会大幅降低效率)。 - 逻辑更清晰:将“数值范围校验”和“连续元素检查”拆分为独立步骤,代码可读性和可维护性更强。
内容的提问来源于stack exchange,提问作者Olek
相关产品推荐
相关产品推荐

