2015-01-16 101 views
0

我提取第三方服務器接收到的數據:如何檢查列表中是否存在具有特定索引的元素?

data = json.loads(response) 
if data: 
    result = data.get('result') 
    if result and len(result)>=38 and len(result[38])>=2: 
     for item in result[38][2]: 
     ... 

條件的想法是檢查列表包含元素與索引38(result[38])和子元素與索引2(result[38][2]),但看起來像這是行不通的,因爲我得到以下例外情況 -

if result and len(result)>=38 and len(result[38])>=2:

TypeError: object of type 'NoneType' has no len()

for item in result[38][2]:

TypeError: 'NoneType' object is not iterable

我應該如何修改我的狀況?

+0

捕獲'IndexError'的例外可能是解決方案之一。 –

+1

'result [38]'的值爲None。 –

+0

此外,您可以檢查'list'類型的'result [38]'。像'if result和len(result)> = 38和type(result [38])== list和len(result [38])> = 2:'但是我建議你用'try/catch'塊捕獲可能的異常,如「IndexError」和「TypeError」。 –

回答

2

您的result[38]值爲Nonelen(result[38])失敗,因爲None單身沒有長度。即使它不是None,您的測試也可能會失敗,因爲您需要索引38的元素存在,但只測試是否存在至少38個元素。如果正好有38個元素,則len(result) >= 38測試將爲true,但仍會得到IndexError

使用異常處理,而不是測試的每一個元素:

data = json.loads(response) 
try: 
    for item in data['result'][38][2]: 
     # ... 
except (KeyError, TypeError, IndexError): 
    # either no `result` key, no such index, or a value is None 
    pass 

這比測試所有中間元件簡單:

if result and len(result) > 38 and result[38] and len(result[38]) > 2: 
+0

異常不能用作流控制元素。在使用它們之前測試元素更好。 –

+1

@PacoAbato您必須是Python新手:https://docs.python.org/2/glossary.html#term-eafp –

+0

@PacoAbato:Python不是Java或C++。在** Python **中,對流量控制使用異常是*一個好主意*。它使代碼更具可讀性和更強大的功能,前提是您只用它來捕獲特定的異常。 –

相關問題