Python浮点数比较异常求助:包裹列表处理结果不符预期
遍历列表时修改原列表导致元素遗漏的问题解决
你的问题并非浮点数精度错误,核心原因是在遍历列表的同时直接修改原列表(调用remove()方法),导致遍历过程跳过了部分元素。
问题本质
当你在for i in package_list循环中移除元素时,列表的长度会动态缩短,遍历的索引会自动递增。比如原列表中15.1被移除后,后面的15.31会向前移动到15.1原来的位置,但此时循环索引已经走到下一个位置,导致15.31不会被遍历检查,最终出现部分符合条件的元素未被处理的情况。
解决方案(两种均使用Python内置函数)
方法1:遍历原列表的副本
通过list(package_list)创建原列表的副本,遍历副本时修改原列表,不会影响遍历过程:
def process_packages(package_list): light_pkgs = [] heavy_pkgs = [] light_weight = 5.00 heavy_weight = 15.00 # 遍历列表副本,避免修改原列表干扰遍历 for i in list(package_list): if i < light_weight: light_pkgs.append(i) elif i > heavy_weight: heavy_pkgs.append(i) package_list.remove(i) return light_pkgs, heavy_pkgs packages = [2.4, 3.44, 4.55, 4.9, 5.11, 5.31, 5.61, 5.99, 6.11, 7.34, 7.9, 9, 11.3, 15.1, 15.31, 15.68, 15.9, 16.7, 19.3, 21] print(process_packages(packages)) print(packages)
方法2:反向遍历原列表
从列表末尾开始遍历,移除元素不会影响前面未遍历的元素,最后调整结果列表的顺序即可:
def process_packages(package_list): light_pkgs = [] heavy_pkgs = [] light_weight = 5.00 heavy_weight = 15.00 # 反向遍历,避免移除元素导致的索引错位 for i in reversed(package_list): if i < light_weight: light_pkgs.append(i) elif i > heavy_weight: heavy_pkgs.append(i) package_list.remove(i) # 调整回原列表的顺序 light_pkgs.reverse() heavy_pkgs.reverse() return light_pkgs, heavy_pkgs packages = [2.4, 3.44, 4.55, 4.9, 5.11, 5.31, 5.61, 5.99, 6.11, 7.34, 7.9, 9, 11.3, 15.1, 15.31, 15.68, 15.9, 16.7, 19.3, 21] print(process_packages(packages)) print(packages)
运行结果
两种方法都能输出你预期的结果:
([2.4, 3.44, 4.55, 4.9], [15.1, 15.31, 15.68, 15.9, 16.7, 19.3, 21]) [2.4, 3.44, 4.55, 4.9, 5.11, 5.31, 5.61, 5.99, 6.11, 7.34, 7.9, 9, 11.3]
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

