当前位置: 首页 > 面试题库 >

NaNs是字典中的关键

云何平
2023-03-14
问题内容

谁能向我解释以下行为?

>>> 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("nan") == float("nan")
False

当字典查找键时,它大致执行以下操作:

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

  2. 对于字典中具有相同哈希值的每个键,请检查其是否与要查找的键匹配。此检查包括

一种。检查对象身份:如果字典中的键和要查找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

由于对象也不相等,因此字典得出未找到键的结论,并抛出a KeyError

您甚至可以这样做:

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

总之,避免使用NaN作为字典键似乎是一个比较明智的主意。



 类似资料:
  • 问题内容: 我在字典中有一个单词列表,其值=关键字的重复,但是我只想要一个不同单词的列表,因此我想计算关键字的数量。有没有一种方法可以计算关键字的数量,或者还有另一种方法我应该寻找不同的单词? 问题答案: 要不就 如果您想计算文件中的唯一词,则可以使用并执行以下操作

  • 我有来自服务器的2个不同的响应,具有相同的键,我将其转换为字典: 对我来说,dict2 中存储什么值并不重要,我需要 dict2 在 dict1 中找到相同的键,并将 dict1 中的完整项目放入新的 dict3 字典中。 输出应该是这样的: 粗略地说,dict2中的键是指针,dict1中的哪些项目可以放入dict3中 解决方案不是def()对我来说很重要

  • 问题内容: 我想将JSON数据存储在Python Pandas DataFrame中 我的JSON数据是像这样的字典的字典 我这样做是为了将数据放入DataFrame 我明白了 我的问题是我的DataFrame包含字典而不是值。 我想知道如何使用Pandas DataFrame管理多维数据(超过2个维度…这里有3个维度)。 DataFrame中的每个字典都有相同的键。 问题答案: df = pd.

  • 问题内容: 我正在使用[UIImage:UIImage]类型的快速字典,并且正在尝试查找给定值的特定键。在Objective- C中,我可以使用allKeysForValue,但是Swift字典似乎没有这种方法。我应该使用什么? 问题答案: Swift 3:针对双射字典的特殊情况,性能更高 如果反向字典查找用例涵盖了在键和值之间具有一对一关系的双射字典,那么穷举收集操作的另一种方法是使用更快的短路

  • 问题内容: 我有一个Python字典,例如: 我想检查一个键是否在字典中。我很想知道以下两种情况中哪一种更为可取,为什么? 问题答案: if ‘name’ in mydict: 是首选的pythonic版本。不鼓励使用,并且在Python 3中已删除 此方法。

  • 问题内容: 我有一本字典 但是,我需要字典的顺序不同: 做这个的最好方式是什么? 问题答案: 字典 没有顺序 。因此,没有办法做到这一点。 如果您使用的是python2.7 +,则可以使用-在这种情况下,您可以使用检索项目列表,然后将其反向并从反向列表中创建一个新项: 如果您使用的是旧版python,则可以从http://code.activestate.com/recipes/576693/获得