List index out of range в списке. Хотя по логике не должно быть

Делаю итерацию по списку и добавляю в этот список значения. Соответственно каждый раз в цикле список обновляется, но на каком то этапе выдаёт ошибку, что якобы индекса в списке нет, хотя по логике кода должно работать....

import pprint

first_col = {
  "num": [
    [1, "25.01.2004", 1, -1, 1, -1],
    [2, "01.02.2004", -1, 1, -1, 1],
    [3, "08.02.2004", 1, -1, 1, 1],
    [4, "15.02.2004", -1, 1, 1, -1]
  ]
}

print(first_col)

for i in first_col["num"]:
    print(i)
    first_st = i[2] * i[3] * i[4]
    i.append(first_st)
    if first_st == i[5]:
        i.append("g")
    elif first_st != i[5]:
        i.append("b")
    
    #print(i)
print(first_col)

#----------------------- 
for ts in range(6,10,2):
    for p in range(1,4):
        print(ts)
        
        f = first_col["num"][p][ts] * first_col["num"][p-1][ts]
        pprint.pprint(first_col)
        first_col["num"][p].append(f)
        if f == first_col["num"][p][5]:
            first_col["num"][p].append("g")
        elif f != first_col["num"][p][5]:
            first_col["num"][p].append("b")

pprint.pprint(first_col)

выдает ошибку:

Traceback (most recent call last):
   line 37, in <module>
    f = first_col["num"][p][ts] * first_col["num"][p-1][ts]
                                  ~~~~~~~~~~~~~~~~~~~~~^^^^
IndexError: list index out of range

при итерации индексы по логике добавляются новые, но почему ошибку выдаёт, уже мозг сломал....

Должен вывести:

{'num': [[1, '25.01.2004', 1, -1, 1, -1, -1, 'g'],
         [2, '01.02.2004', -1, 1, -1, 1, 1, 'g', -1, 'b'],
         [3, '08.02.2004', 1, -1, 1, 1, -1, 'b', -1, 'b', 1, 'g'],
         [4, '15.02.2004', -1, 1, 1, -1, -1, 'g', 1, 'b', -1, 'g', -1. 'g']]}

Заранее спасибо!


Ответы (1 шт):

Автор решения: Алексей Р

Ошибка происходит из-за того что в каждой итерации внутреннего цикла выражение first_col["num"][p - 1][ts] пытается получить элемент с индексом ts из подсписков 0..2, но подсписок 0 никогда не наращивается, поэтому при ts==8 индекс выходит за границы. Для корректной работы нужно увеличивать нижнюю границу вложенного цикла в конце каждой итерации внешнего цикла (реализовано с помощью переменной start). Также нужно добавить единицу к верхней границе внешнего цикла for ts in range(6, 11, 2):, иначе значение 10 будет недостижимо.

import pprint

first_col = {
    "num": [
        [1, "25.01.2004", 1, -1, 1, -1],
        [2, "01.02.2004", -1, 1, -1, 1],
        [3, "08.02.2004", 1, -1, 1, 1],
        [4, "15.02.2004", -1, 1, 1, -1]
    ]
}

for i in first_col["num"]:
    first_st = i[2] * i[3] * i[4]
    i.append(first_st)
    i.append("g" if first_st == i[5] else 'b')

# -----------------------
start = 1
for ts in range(6, 11, 2):
    for p in range(start, 4):
        f = first_col["num"][p][ts] * first_col["num"][p - 1][ts]
        first_col["num"][p].append(f)
        first_col["num"][p].append("g" if f == first_col["num"][p][5] else 'b')
    start += 1

pprint.pprint(first_col)
{'num': [[1, '25.01.2004', 1, -1, 1, -1, -1, 'g'],
         [2, '01.02.2004', -1, 1, -1, 1, 1, 'g', -1, 'b'],
         [3, '08.02.2004', 1, -1, 1, 1, -1, 'b', -1, 'b', 1, 'g'],
         [4, '15.02.2004', -1, 1, 1, -1, -1, 'g', 1, 'b', -1, 'g', -1, 'g']]}

Немного сократил конструкции if, заменив на тернарный оператор.

→ Ссылка