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

rak*_*kke 1 python dictionary numpy

我有一本字典词典,即dict[key1][key2]应该返回一个数字.如果我这样做key2 in dict[key1]返回True,但dict[key1].get(key2)返回None.

我想这里有一些非常基本的东西,但是我被卡住了.

由于key1是a string,而key2是a 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
Run Code Online (Sandbox Code Playgroud)

编辑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]
Run Code Online (Sandbox Code Playgroud)

输出:

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')
Run Code Online (Sandbox Code Playgroud)

编辑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
Run Code Online (Sandbox Code Playgroud)

输出:

Vessel: VESSEL2 ati: 2014-07-21T02:00:00.000000+0200 ati == key: True
Vessel: VESSEL2 sailing: None
Run Code Online (Sandbox Code Playgroud)

编辑5:

感谢@ jamylak的回答,我使用Timestamp而不是datetime64-object进行了解决方法.

jam*_*lak 5

您提供的信息中唯一的选项是key2存在于dict[key1]key2具有值None

编辑:

它们是两个完全不同的对象,恰好看起来像完全相同的对象.

从您的代码中有:

numpy.datetime64('2014-07-21T02:00:00.000000+0200')
Run Code Online (Sandbox Code Playgroud)

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

这是因为当你检查in dict.keys()它时,它对由方法构建的==每个元素执行了相等的check()list.keys()

numpy.datetime64('2014-07-21T02:00:00.000000000+0200') == numpy.datetime64('2014-07-21T02:00:00.000000+0200')
Run Code Online (Sandbox Code Playgroud)

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

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

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


至于他们比较平等和有不同的原因hash,我认为是某种错误.