Python使用循环移除列表指定范围外元素失败,求代码排查
问题分析与解决
你的代码问题出在移除元素后仍然递增索引j,导致跳过了本该检查的元素。
当执行data.pop(j)时,列表中j位置之后的所有元素都会向前移动一位(填补被移除元素的空缺),但你紧接着执行j += 1,就跳过了现在处于j位置的新元素(原本是j+1位置的元素),所以部分不符合条件的元素没被检查到,最终留在了列表里。
修正方案1:仅当元素符合条件时递增索引
修改循环逻辑,只有当前元素在范围内时才移动到下一个索引,否则保持j不变,继续检查当前位置的新元素:
lower = int(input("Lower bound: ")) upper = int(input("Upper bound: ")) j = 0 while j < len(data): if data[j] < lower or data[j] > upper: data.pop(j) else: # 元素符合条件,才移动到下一个位置 j += 1 for i in range(len(data)): print(data[i], end = " ") print()
修正方案2:倒序遍历列表
从后往前遍历索引,这样删除元素不会影响前面未检查的元素的索引(因为前面的元素索引不会被后面的删除操作改变):
lower = int(input("Lower bound: ")) upper = int(input("Upper bound: ")) # 从最后一个索引倒序遍历到0 for j in range(len(data)-1, -1, -1): if data[j] < lower or data[j] > upper: data.pop(j) for i in range(len(data)): print(data[i], end = " ") print()
两种方案都能解决你的问题,用测试数据验证后,最终列表会只保留11到41之间的元素,没有超出范围的内容。
内容的提问来源于stack exchange,提问作者Asalem
相关产品推荐
相关产品推荐

