2015-01-16 3 views
0

извлечь данные, полученные с 3-го сервера партии:Как проверить наличие элемента с определенным индексом в списке?

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

Catching 'IndexError' исключение может быть один из раствора. –

+1

Значение 'result [38]' is None. –

+0

Кроме того, вы можете проверить 'result [38]' для типа 'list'. Подобно 'if result и len (result)> = 38 и type (result [38]) == list и len (result [38])> = 2:' но я бы предложил вам реализовать с помощью блока try/catch фиксируя возможные исключения, такие как 'IndexError' и' TypeError'. –

ответ

2

Ваше result[38] значение None, и len(result[38]) не работает, потому что None singleton не имеет длины. Даже если это не было None, ваш тест может также потерпеть неудачу, потому что вам нужно найти 0 элементов для индекса 38, но вы проверяете только если есть не менее 38 элементов. Если будет ровно 38 элементов, ваш тест len(result) >= 38 будет правдой, но вы все равно получите 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 ** использование исключений для управления потоком - это замечательная идея *. Это делает код более читабельным и более надежным, если вы используете его, чтобы поймать только определенные исключения. –

Смежные вопросы