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, заменив на тернарный оператор.