浮点数不评估为负数(Python)

Posted

技术标签:

【中文标题】浮点数不评估为负数(Python)【英文标题】:Floats not evaluating as negative (Python) 【发布时间】:2015-10-20 15:32:24 【问题描述】:

我正在尝试删除列表中为负的浮点值。包含所有值的原始列表如下所示:

[
    0.030079979253112028,
    -0.006015995850622406, 
    -0.08920269709543568,   
    -25.72356846473029,
    -9.770807053941908, 
    -66.38340248962655, 
    -188.7778008298755,
    -165.95850622406638,
    99.99,
    33.81404564315352,
    0.1742564315352697,
    -0.00560109958506224,
    -0.008297925311203318,
    -1.4044238589211617
]

在我运行for 循环后显示if num<0: list.remove(num),列表如下所示:

[
    0.030079979253112028,
    -0.08920269709543568,
    -9.770807053941908,
    -188.7778008298755,
    99.99,
    33.81404564315352,
    0.1742564315352697,
    -0.008297925311203318
]

所以一些负面的 vlues,比如 -66.383... 被删除了,但其他的没有。这是为什么呢?

【问题讨论】:

【参考方案1】:

为了说明这里发生的事情以及为什么改变您当前正在迭代的序列是一个坏主意:

1, -1, -1, 0
^ # this is your iterator starting at the beginning

1, -1, -1, 0
    ^  # after on step we are here your function has deemed this value unworthy 

1, _, -1, 0
   ^  # the value has been removed but we can't have an empty space so everything gets moved forward

1, -1, 0
    ^  # now everything has shifted forward but our iterator has not moved.

1, -1, 0
       ^  # Our iterator goes to the next step without ever having evaluated the value that got shifted in to the removed values place.

您会注意到您的模式导致列表中保留的否定总是在最初的另一个否定之前。更好的做法是创建一个新列表,省略不需要的值或对象:

new_list = [x for x in old_list if foo(x)] 

【讨论】:

【参考方案2】:

您正在迭代和改变列表,这意味着您最终会删除错误的元素,您可以使用reversed:

for num in reversed(lst):
    if num < 0:
        lst.remove(num)

或者复制一份:

for num in lst[:]:
    if num < 0:
        lst.remove(num)

您也可以使用列表组合来修改原始列表:

lst[:] = [num for num in lst if num >= 0]

【讨论】:

@Syd,它是一个反向迭代器,我在答案中添加了指向文档的链接,从列表中删除元素意味着您在开始迭代时更改了指针指向的元素。

以上是关于浮点数不评估为负数(Python)的主要内容,如果未能解决你的问题,请参考以下文章

浮点数的存储

Android 浮点数和负数验证

python浮点数精度问题

如何在 Swift 中将十六进制转换为有符号浮点数?适用于正数但不适用于负数

IEEE754表示浮点数

python中浮点数的处理