Python 输入dict.keys(),但dict.get(Key)返回None
我有一本词典,即Python 输入dict.keys(),但dict.get(Key)返回None,python,numpy,dictionary,Python,Numpy,Dictionary,我有一本词典,即dict[key1][key2]应该返回一个数字。 如果在dict[key1]中执行key2操作,则返回True,但dict[key1]。get(key2)返回None 我想我在这里遗漏了一些基本的东西,但我被卡住了 因为键1是一个字符串,而键2是一个numpy.datetime64 编辑: 输出: vessel: VESSEL2 ati type: <type 'numpy.datetime64'> value: 2014-07-21T02:00:00.000000
dict[key1][key2]
应该返回一个数字。
如果在dict[key1]中执行key2
操作,则返回True
,但dict[key1]。get(key2)
返回None
我想我在这里遗漏了一些基本的东西,但我被卡住了
因为键1是一个字符串
,而键2是一个numpy.datetime64
编辑:
输出:
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')
输出:
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
编辑:
它们是两个完全不同的对象,恰好看起来像完全相同的对象
您的代码中有:
numpy.datetime64('2014-07-21T02:00:00.000000+0200')
及
这是因为当您在dict.keys()中检查
时,它会对列表中由.keys()
方法生成的每个元素执行相等检查(=
),并且
numpy.datetime64('2014-07-21T02:00:00.000000000+0200') == numpy.datetime64('2014-07-21T02:00:00.000000+0200')
如果您尝试运行dict中的键
,它将返回False
,因为这不会构建中介列表
,而是使用哈希
它们是字典中不同的对象,因为字典使用的是hash
这就是dict.keys()
中的不起作用的原因
.get
也没有找到它,因为它返回None
,您可以将默认的None
更改为其他内容来证明这一点
至于它们比较相等并有不同的散列的原因,我认为是某种缺陷。根据您提供的信息,唯一的选择是key2
存在于dict[key1]
中,而key2
的值为None
编辑:
它们是两个完全不同的对象,恰好看起来像完全相同的对象
您的代码中有:
numpy.datetime64('2014-07-21T02:00:00.000000+0200')
及
这是因为当您在dict.keys()中检查时,它会对列表中由.keys()
方法生成的每个元素执行相等检查(=
),并且
numpy.datetime64('2014-07-21T02:00:00.000000000+0200') == numpy.datetime64('2014-07-21T02:00:00.000000+0200')
如果您尝试运行dict中的键
,它将返回False
,因为这不会构建中介列表
,而是使用哈希
它们是字典的不同对象,因为字典使用的是散列
,这就是dict.keys()
中的不起作用的原因
.get
也没有找到它,因为它返回None
,您可以将默认的None
更改为其他内容来证明这一点
至于为什么它们比较相等并且有不同的哈希值,我认为是某种错误。您可以尝试使用get两次:
dictionary.get('key1', {}).get('key2')
如果key1或key2不存在,则返回None。您可以尝试使用get两次:
dictionary.get('key1', {}).get('key2')
如果key1或key2不存在,则返回None。脚本中可能发生的情况的有效示例:
>>> dict = {'key1': {'key2': None}}
>>> print('key2' in dict['key1'])
True
>>> print(dict['key1']['key2'])
None
脚本中可能发生的情况的一个有效示例:
>>> dict = {'key1': {'key2': None}}
>>> print('key2' in dict['key1'])
True
>>> print(dict['key1']['key2'])
None
我已经尝试了下面的代码部分,没有问题。你能坚持到底,看看你是否仍然遇到同样的问题吗
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
>>>
我已经尝试了下面的代码部分,没有问题。你能坚持到底,看看你是否仍然遇到同样的问题吗
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
>>>
key2
的值是否为None
get()
?如果第二个键丢失而不是没有,你会得到KeyError
。不,这很奇怪。该值不应该是零,而且在我看到此错误的dict中它不是零。你能做一个打印dict
来验证它不是零吗?@rakke我尝试复制你的问题,但没有成功。你能发布y吗我们的实际代码?key2
的值是否为None
?get()
返回指定键处的值,因此您的dict是否可能看起来像{key1:{key2:None}
?如果第二个键丢失而不是没有,你会得到KeyError
。不,这很奇怪。该值不应该是零,而且在我看到此错误的dict中它不是零。你能做一个打印dict
来验证它不是零吗?@rakke我尝试复制你的问题,但没有成功。你能发布y吗我们的实际代码?不,我同意可能是这样的,但是如果我使用dict[key1][key2],我也会得到一个keyrerror,而不是None。不,我同意可能是这样的,但是如果我使用dict[key1][key2],我也会得到一个keyrerror,而不是None。我使用的是Python 2.7.9(Python(x,y))在windowsSame上,我也尝试过复制OP的问题,但我似乎做不到。我得到了与您相同的结果。我使用的是Python 2.7.9(Python(x,y))在Windows上对我来说也是一样,我试图复制OP的问题,但我似乎做不到。@rakke我没有得到你的编辑,为什么你不能显示你收到的命令的实际日志ran@rakke您从未在self.sailing[船只]中运行过ati
所以根本没有证据证明这一点,你在问题中说的是真的。是的,我在第一次编辑时做了。我在发布时并没有编造输出,但我也会在第二次编辑中添加id。…@rakke编辑3中的所有代码都是一次执行的,还是在两次编辑之间发生了什么事情?如果所有代码都是一次执行的,那么中间什么都没有。On例外情况:为了减少输出,我只打印了一艘船的“dict[key]:”,self.sailing[vessel][ati],因此它在以下位置执行:如果船只==“VESSEL2”:@rakke我没有得到你的编辑,为什么你不能显示你收到的命令的实际日志ran@rakke你从来没有