2015-08-28 54 views
1

我確信這是一個非常基本的東西,我錯過了這裏,但是我已經撞到了我的頭,並且無法觸及它的底部。因此,需要幫助,如果有人能取悅:無法從python中的字典中獲取值

所以,我有形式

myDic = { 
     'request_path':['api', 'v1', 'settings'], 
     'request_headers':[['Accept', 'application/json; charset=utf-8'], ['app-version', '1.0.17'], ['version-code', '40'], ['os-version', '4.3'], ['deviceId', '000000000000000'], ['User-Agent', 'App-Android'], ['Host', 'api.applic.in'], ['Connection', 'Keep-Alive'], ['Accept-Encoding', 'gzip']] 
     } 

的字典所以request_path鍵具有的值是一個列表。而request_headers鍵的值是列表的列表。

現在在我的代碼,我想這樣做(除其他事項外):

componentSize = len(myDic.get('request_path')) 
genericCounter =0 
while (genericCounter < componentSize): 
    print str(genericCounter+1) + "." + str(myDic.get('request_path')[genericCounter]) 
    genericCounter = genericCounter + 1 

而這給了我預期的結果爲:

1.api 
2.v1 
3.settings 

然而,下面,取代在上面,

print str(myDic.get('request_headers')[genericCounter][0]) or 
print str(myDic.get('request_headers')[genericCounter][0][0]) or 
print str(myDic.get('request_headers')[genericCounter][0][0][0]) 

給了我一個錯誤:

File "myRep.py", line 393, in tamperData 
    print str(myDic.get('requestHeaders')[genericCounter][0][0][0]) 
    File "/Library/Python/2.7/site-packages/netlib/odict.py", line 42, in __getitem__ 
    k = self._kconv(k) 
    File "/Library/Python/2.7/site-packages/netlib/odict.py", line 206, in _kconv 
    return s.lower() 
AttributeError: 'int' object has no attribute 'lower' 

奇怪的是,當我嘗試

print str(myDic.get('request_headers')[genericCounter][0]) 
從Python提示

- 它給我的第一個列表是:

['Accept', 'application/json; charset=utf-8'] 

現在我試着調試問題,去/庫/ Python/2.7/site-packages/netlib/odict.py如錯誤中所示,並且看起來像get(key)返回傳遞鍵值的列表類型。因此,爲什麼我的第一次嘗試工作正常,這是有道理的。

但是在第二種情況下(request_headers),get(key)應該返回一個列表,不是嗎(只是在這裏它會列出一個列表)?首先是這個問題。

+2

怎麼做'/ NETLIB/odict.py'適合這個? –

回答

2

您有netlib.odict.ODict()對象;它不是一個列表,即使它們的repr()返回值(不幸)看起來像一個。你不能使用整數直接索引到這個結構。

把它當作字典來代替;鑰匙是不區分大小寫:

print myDic['request_headers']['accept'] 

不要使用while循環用計數器; Python for循環直接爲您提供對象。例如,在字典上循環顯示字典中的關鍵字。該ODict()類型就像太:

for header_name in myDic['request_headers']: 
    print header_name, myDic['request_headers'][header_name] 

或包括在循環中的值:

for header_name, header_value in myDic['request_headers'].items(): 
    print header_name, header_value 

使用while循環會很麻煩:

keys = myDic['request_headers'].keys() 
index = 0 
while index < len(keys): 
    header_name = keys[index] 
    print header_name, myDic['request_headers'][header_name] 
+1

這是如何導致某些東西變成一個整數? –

+1

@PadraicCunningham據我瞭解,'ODict'試圖'降低'鍵(「他們的鍵不區分大小寫」),期望它是一個字符串,但它是一個int。 –

+0

另外,如果我使用while或for,它真的很重要。邏輯最終是一樣的。不是嗎? – qre0ct