Первый пункт, семантически, ваш список должен быть списком кортежей, а не списком списков (если позиция значительна, то это кортеж - список должен быть однородной коллекцией).
Также изменение списка на месте - в основном бесполезная сложность, особенно для такого небольшого набора данных. Самое простое решение - создать новый список из существующего, ie:
def parse_row(row):
return (row[0], int(row[1]), float(row[2])) + row[3:]
def parse_data(data):
return [parse_row(row) for row in data]
if __name__ == "__main__":
state_data = [
("foo", "1", "1.5", "a", "b"),
("bar", "2", "2.5", "c", "d"),
("baaz", "3", "3.5", "e", "f"),
("quux", "4", "4.5", "g", "h"),
]
print(parse_data(state_data))
относительно вашей проблемы:
for d in statesData[i]:
d[1] = int(d[1])
d[2] = float(d[2])
здесь, statesData[i]
ваш текущий подсписок Таким образом, переменная итерации d
последовательно восстанавливается для каждого из элементов вашего подсписка.