在 Python 中比较浮点数时遇到问题

问题描述 投票:0回答:1

我知道这应该更容易,但我在比较浮点值时遇到问题。

我有一些非常基本的代码,可以做一些事情:

  1. 任何低于 5 的重量都会添加到 light_pkgs 中。
  2. 任何超过 15 的重量都会添加到 Heavy_pkgs 中。
  3. 任何超过 15 的权重都会从原始
    packages
    列表中删除。
def process_packages(package_list):
    light_pkgs = []
    heavy_pkgs = []

    light_weight = 5.00
    heavy_weight = 15.00

    for i in package_list:
        if i < light_weight:
            light_pkgs.append(i)

        elif i > heavy_weight:
            heavy_pkgs.append(i)
            packages.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)

我相信,由于精度错误,我的代码无法识别 15.xx 范围内的几个数字。

此外,我仅限于使用内置的 Python 函数。

预期输出:

([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]

实际产量:

([2.4, 3.44, 4.55, 4.9], [15.1, 15.68, 16.7, 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, 15.31, 15.9, 19.3]

正如您所看到的,15 以上的几个数字没有被添加到 Heavy_pkgs 列表中,也没有从原始包列表中删除。

python math precision
1个回答
1
投票

您遇到了以下问题:如何在迭代时从列表中删除项目?需要额外的步骤。

全局作用域中的

packages
与函数作用域中的
package_list
是相同的(它们都是同一个
list
的别名)。当您在迭代它时
remove
时,您会跳过对紧随已删除元素之后的元素的迭代(因为它向下移动一个槽,并且迭代器在下一个循环中前进到该槽)。

使用中等权重构建一个新的

list
,并在循环完成后替换
package_list
的内容,一切都应该可以正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.