Ошибка индекса вне диапазона, но я не могу понять, почему?

Я надеялся, что кто-нибудь может помочь мне со следующим:

У меня есть следующие данные в некоторых списках в списках -> A

A = [[['Ghost Block'], ['Ghost Block'], [-7.0, -30000.0, 84935.99999999991, 1.0, 5.0, 0, 84935.99999999991, 1, 1, ['Ghost', 3, 'Ghost', 'Ghost', 'Ghost', 'Ghost', 2, 'Ghost']], [-5.0, -30000.0, 84935.99999999991, 1.0, 4.0, -30000.0, 114935.99999999991, 2, 1, ['Ghost', 3, 'Ghost', 'Ghost', 'Ghost', 'Ghost', 2, 'Ghost']], [-3.0, 33475.49999999997, 84935.99999999991, 1.0, 3.0, -60000.0, 144935.9999999999, 3, 1, ['Ghost', 3, 'Ghost', 'Ghost', 'Ghost', 'Ghost', 2, 'Ghost']], [-1.0, 80158.49999999997, 84935.99999999991, 1.0, 2.0, -26524.50000000003, 111460.49999999994, 4, 1, ['Ghost', 3, 'Ghost', 'Ghost', 'Ghost', 'Ghost', 2, 'Ghost']], [1.0, 31301.99999999997, 84935.99999999991, 1.0, 1.0, 53633.99999999994, 31301.99999999997, 5, 1, ['Ghost', 3, 'Ghost', 'Ghost', 'Ghost', 'Ghost', 2, 'Ghost']]]]
TempValue = 0
Ghost_Block = -60000
for i in range(0,len(A)):
    for item in range(0,len(A[i])):
        if A[i][item] == 'Ghost Block':
            continue
        else:
            if A[i][item][9][0] == 'Ghost': # Neighbor 1
                TempValue += (Ghost_Block*A[i][item][4]) 

Я получаю следующее сообщение об ошибке:

--> 9             if Value_Spec_Depth[i][item][9][0] == 'Ghost': # Neighbor 1
IndexError: list index out of range

По моему мнению Value_Spec_Depth[i][item][9][0] не выходит за пределы диапазона. Я надеюсь, что кто-то может объяснить мне, почему я получаю эту ошибку. Спасибо

1 ответ

Решение

За item ценности 0 а также 1, A[i][item] является ['Ghost Block']не 'Ghost Block' (обратите внимание на список с 1 значением), поэтому ваш if тест никогда не проходит и else блок выполняется вместо:

>>> A[0][0]
['Ghost Block']
>>> A[0][1]
['Ghost Block']

В результате else Suite пытается получить доступ к индексу 9 списка только с одним.

Вы бы избежали этого, фактически проверяя список:

if A[i][item] == ['Ghost Block']:

или протестируйте первый элемент списка:

if A[i][item][0] == 'Ghost Block':

Обратите внимание, что вы можете просто зацикливать списки напрямую, вам не нужно создавать индексы. Вам также не нужно использовать continue если вы просто проверить на обратное:

for sublist in A:
    for element in sublist:
        if element[0] != 'Ghost Block' and element[9][0] == 'Ghost':
            TempValue += Ghost_Block * element[4]

Еще одним улучшением будет использование пользовательских классов вместо списков; из использования индексов вообще не ясно, какое значение имеет каждое значение.

Другие вопросы по тегам