[英]Key in dict.keys(), but dict.get(key) returns None
我有字典的字典,即dict[key1][key2]
应该返回一个数字。 如果我key2 in dict[key1]
执行key2 in dict[key1]
返回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
的值为None
编辑:
它们是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()
它将对由.keys()
方法构建的list
中的每个元素进行相等检查( ==
),并且
numpy.datetime64('2014-07-21T02:00:00.000000000+0200') == numpy.datetime64('2014-07-21T02:00:00.000000+0200')
如果您尝试key in dict
运行key in dict
,它将返回False
因为这不会建立中介list
,而是使用hash
它们是与字典不同的对象,因为字典使用的是hash
,这就是为什么in dict.keys()
不起作用的原因。
.get
也因为它返回没有找到它None
,你可以更改默认None
别的东西来证明这一点。
至于为什么它们比较相等并且具有不同的hash
,我认为是某种错误。
我已经尝试了以下代码部分,没有任何问题。 您可以继续查看是否仍然遇到相同的问题吗?
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>> k = numpy.datetime64("2014-08-11T02:00:00.000000000+0200")
>>> print k
2014-08-11T08:00:00.000000000+0800
>>> dic = {"k":{k:1}}
>>> print dic
{'k': {numpy.datetime64('2014-08-11T08:00:00.000000000+0800'): 1}}
>>> dic.items()
[('k', {numpy.datetime64('2014-08-11T08:00:00.000000000+0800'): 1})]
>>> dic["k"].items()
[(numpy.datetime64('2014-08-11T08:00:00.000000000+0800'), 1)]
>>> dic["k"].get(k)
1
>>>
您可以尝试使用get两次:
dictionary.get('key1', {}).get('key2')
如果key1或key2不存在,则将返回None。
一个有效的示例,说明脚本中可能发生的情况:
>>> dict = {'key1': {'key2': None}}
>>> print('key2' in dict['key1'])
True
>>> print(dict['key1']['key2'])
None
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.