gpt4 book ai didi

python - NaN 作为字典中的键

转载 作者:IT老高 更新时间:2023-10-28 20:59:44 28 4
gpt4 key购买 nike

谁能向我解释以下行为?

>>> import numpy as np
>>> {np.nan: 5}[np.nan]
5
>>> {float64(np.nan): 5}[float64(np.nan)]
KeyError: nan

为什么它在第一种情况下有效,而在第二种情况下无效?此外,我发现以下确实有效:

>>> a ={a: 5}[a]
float64(np.nan)

最佳答案

这里的问题是 NaN 不等于它自己,正如 IEEE float 标准中定义的那样:

>>> float("nan") == float("nan")
False

当字典查找一个键时,它大致是这样的:

  1. 计算要查找的键的哈希值。

  2. 对于dict中具有相同哈希的每个键,检查它是否与要查找的键匹配。该检查包括

    一个。检查对象身份:如果字典中的键和要查找的键是 is 运算符指示的相同对象,则找到键。

    b.如果第一次检查失败,请使用 __eq__ 运算符检查是否相等。

第一个例子成功了,因为 np.nannp.nan 是同一个对象,所以它们不相等也没关系:

>>> numpy.nan is numpy.nan
True

在第二种情况下,np.float64(np.nan)np.float64(np.nan) 不是同一个对象——两个构造函数调用创建两个不同的对象:

>>> numpy.float64(numpy.nan) is numpy.float64(numpy.nan)
False

由于对象也没有比较相等,因此字典得出未找到键并抛出 KeyError 的结论。

你甚至可以这样做:

>>> a = float("nan")
>>> b = float("nan")
>>> {a: 1, b: 2}
{nan: 1, nan: 2}

总之,避免 NaN 作为字典键似乎是一个更明智的想法。

关于python - NaN 作为字典中的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6441857/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com