从Python列表删除小于n的数值时浮点数被忽略的问题排查
问题原因
你遇到的不是浮点数处理的问题,是遍历列表的同时删除列表元素导致的经典逻辑bug,同时搭配index()方法还有额外的隐患,具体原因如下:
- 遍历动态变化的列表会跳过元素:Python的for循环遍历列表时,会按索引顺序依次取值。你删除某个索引的元素后,后面的所有元素都会自动前移一位,导致下一次遍历直接跳过了前移的那个元素。
以你给出的测试用例为例:- 初始列表为
[2000, 10, 69.29],第一次遍历取索引0的值2000,判断为合格,无删除操作 - 第二次遍历取索引1的值10,判断为小于1000,删除索引1的元素,此时列表变为
[2000, 69.29],长度从3变成2 - 第三次遍历预期取索引2的值,但当前列表最大索引是1,循环直接终止,69.29完全没有被遍历处理,所以看起来像是浮点数没被处理
- 初始列表为
index()方法有潜在风险:如果列表中存在重复值,index()只会返回第一个匹配值的索引,会出现删错元素的问题。
修复方案
方案1:列表推导式(最推荐)
直接生成符合要求的新列表,逻辑简洁性能高,是处理这类过滤需求的首选写法:
percentages = [2000, 10, 69.29] # 只保留大于等于1000的元素 percentages = [p for p in percentages if p >= 1000] print(percentages)
方案2:倒序遍历原列表
如果必须在原列表上做删除操作,倒序遍历索引就不会出现元素前移导致的跳过问题:
percentages = [2000, 10, 69.29] # 从最后一个索引倒着遍历到0 for i in range(len(percentages)-1, -1, -1): percentage = percentages[i] if percentage < 1000: print("PASS") del percentages[i] else: print("Qualified") print(percentages)
内容的提问来源于stack exchange,提问作者Hannah
相关产品推荐
相关产品推荐

