簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM