You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 20:53:23