【问题标题】:Key in dict.keys(), but dict.get(key) returns None输入 dict.keys(),但 dict.get(key) 返回 None
【发布时间】:2015-06-02 15:11:44
【问题描述】:

我有一本字典,即dict[key1][key2] 应该返回一个数字。 如果我这样做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 的值可以是None 吗? get() 返回指定键的值,所以您的 dict 是否可能看起来像 {key1: {key2: None}
  • 如果第二个键丢失而不是没有,您将得到KeyError
  • 不,这很奇怪。该值永远不应为 None,并且在我看到此错误的 dicts 中也不是 None。
  • 你能做一个print dict 来验证它不是None吗?
  • @rakke 我已尝试复制您的问题,但没有成功。你能发布你的实际代码吗?

标签: python numpy dictionary


【解决方案1】:

您提供的信息中唯一的选择是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() 时,它会对 list 中的每个元素进行相等检查 (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,我认为是某种错误。

【讨论】:

  • @rakke 我没有得到你的编辑,你为什么不能显示你运行的命令的实际日志
  • @rakke 你从来没有跑过ati in self.sailing[vessel],所以绝对没有证据证明你在问题中说的是真的
  • 是的,我在第一次编辑中做了。发帖时我没有补输出,但我也会在第二次编辑中添加 id....
  • @rakke 编辑 3 中的所有代码是同时执行的,还是两者之间发生了什么?
  • 如果全部同时执行,中间没有任何内容。一个例外:为了减少输出,我只为一艘船打印了 "dict[key]:",self.sailing[vessel][ati],因此它在以下时间执行: ifvessel == "VESSEL2":
【解决方案2】:

我已经尝试了以下代码部分,没有任何问题。你能继续看看你是否仍然遇到同样的问题吗?

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
>>> 

【讨论】:

  • 我得到了和你一样的输出。我在 Windows 上使用 Python 2.7.9 (Python(x,y))
  • 对我来说也一样,我试图复制 OP 的问题,但我似乎做不到。
【解决方案3】:

你可以尝试使用 get 两次:

dictionary.get('key1', {}).get('key2')

如果 key1 或 key2 不存在,这将返回 None。

【讨论】:

    【解决方案4】:

    脚本中可能发生的事情的一个有效示例:

    >>> dict = {'key1': {'key2': None}}
    >>> print('key2' in dict['key1'])
    True
    >>> print(dict['key1']['key2'])
    None
    

    【讨论】:

    • 不,我同意这可能是这种情况,但如果我执行 dict[key1][key2],我也会得到 KeyError not None
    猜你喜欢
    • 2016-01-20
    • 1970-01-01
    • 2018-01-04
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    相关资源
    最近更新 更多