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你从来没有