Skip to main content
 首页 » 编程设计

python之键入 dict.keys(),但 dict.get(key) 返回 None

2025年05月04日13bjzhanghao

我有一个字典的字典,即 dict[key1][key2] 应该返回一个数字。 如果我在 dict[key1] 中执行 key2 这将返回 True,但是 dict[key1].get(key2) 返回 None.

我想我在这里缺少一些非常基本的东西,但我被困住了。

因为 key1 是一个 string,而 key2 是一个 numpy.datetime64。

编辑:

key type: <type 'numpy.datetime64'> 
key: 2014-08-11T02:00:00.000000+0200 
Dict: {numpy.datetime64('2014-08-11T02:00:00.000000000+0200'): 1} 
key in dict.keys() True 
dict.items(): [(numpy.datetime64('2014-08-11T02:00:00.000000000+0200'), 1)] 
dict.get(key): None 

编辑 2:

由编辑 3 替换

编辑 3(替换编辑 2):

代码:

vessel = df['Vessel'].iloc[0] 
print "vessel:",vessel 
ati = np.datetime64(df['ATI'].iloc[0]) 
print "ati type:",type(ati),"value:",ati 
print "Self.sailing[vessel]:",self.sailing[vessel] 
print "key in dict.keys():",ati in self.sailing[vessel].keys() 
sailing = self.sailing[vessel].get(ati) 
print "sailing:", sailing 
print "dict[key]:",self.sailing[vessel][ati] 

输出:

vessel: VESSEL2 
ati type: <type 'numpy.datetime64'> value: 2014-07-21T02:00:00.000000+0200 
Self.sailing[vessel]: {numpy.datetime64('2014-07-21T02:00:00.000000000+0200'): 1} 
key in dict.keys(): True 
sailing: None 
dict[key]: 
Traceback (most recent call last): 
  File "C:/dev/python/bmw_vpc/src/vpc_data_extractor.py", line 9, in <module> 
    data.create_master_file() 
  File "C:\dev\python\bmw_vpc\src\process.py", line 112, in create_master_file 
    print "dict[key]:",self.sailing[vessel][ati] 
KeyError: numpy.datetime64('2014-07-21T02:00:00.000000+0200') 

编辑 4:

代码:

for key in self.sailing[vessel].keys(): 
    print "Vessel:",vessel,"ati:",ati,"ati == key:",ati == key 
sailing = self.sailing[vessel].get(ati) 
print "Vessel:",vessel,"sailing:", sailing 

输出:

Vessel: VESSEL2 ati: 2014-07-21T02:00:00.000000+0200 ati == key: True 
Vessel: VESSEL2 sailing: None 

编辑 5:

感谢@jamylak 的回答,我使用时间戳而不是 datetime64 对象做了一个解决方法。

请您参考如下方法:

根据您提供的信息,唯一的选择是 key2 存在于 dict[key1] 中,并且 key2 的值为 无

编辑:

它们是 2 个完全不同的对象,但恰好看起来像完全相同的对象。

从你的代码中有:

numpy.datetime64('2014-07-21T02:00:00.000000+0200') 

和

numpy.datetime64('2014-07-21T02:00:00.000000000+0200') 

>>> (hash(numpy.datetime64('2014-07-21T02:00:00.000000000+0200')) 
  == hash(numpy.datetime64('2014-07-21T02:00:00.000000+0200'))) 
False 

之所以这样,是因为当您检查 in dict.keys() 时,它会对 中的每个元素进行相等检查 (==) list 由 .keys() 方法和

构建
numpy.datetime64('2014-07-21T02:00:00.000000000+0200') == numpy.datetime64('2014-07-21T02:00:00.000000+0200') 

如果您尝试运行 key in dict,它将返回 False,因为它不会构建中间 list 而是使用 hash

它们是字典的不同对象,因为字典使用的是 hash,这就是 in dict.keys() 不起作用的原因。

.get 也没有找到它,因为它返回None,您可以将默认的None更改为其他东西可以证明这一点。


至于为什么它们比较相等而具有不同的hash,我认为是某种错误。