str (список [индекс]): ошибка индекса: индекс списка вне диапазона

#python #list #numpy

#python #Список #numpy

Вопрос:

Я просто пытаюсь загрузить файл, извлечь его первый и третий столбцы, рандомизировать их и сгенерировать новый файл следующим образом:

 import random
import numpy as np

q0 = np.loadtxt("G:\out.txt")[:, 0].tolist()
q2 = np.loadtxt("G:\out.txt")[:, 2].tolist()

z0 = [round(random.uniform(-4,4),4) for x in range(488)]
z2 = [round(random.uniform(-4,4),4) for x in range(488)]

r_pos_coord = [round(sum(x),3) for x in zip(q0,z0)]
r_tar_coord = [round(sum(x),3) for x in zip(q2,z2)]

t_pos_coord = [round(random.uniform(0,360),4) for x in range(488)]
t_tar_coord = [round(random.uniform(0,360),4) for x in range(488)]

par1 = [random.randint(0,1) for x in range(488)]
par2 = [x-1 if x==1 else x 1 for x in par1]
p = [1 for x in range(488)]

with open('G:\target.txt', 'w') as writer:
    for index in range(1,488):
        writer.write(str(r_pos_coord[index]))
        writer.write(' t')
        writer.write(str(t_pos_coord[index]))
        writer.write(' t')
        writer.write(str(r_tar_coord[index]))
        writer.write(' t')
        writer.write(str(t_tar_coord[index]))
        writer.write(' t')
        writer.write(str(par1[index]))
        writer.write('t')
        writer.write(str(par2[index]))
        writer.write('t')
        writer.write(str(p[index]))
        writer.write('n')
  

AFAIK, оба r_pos_coord и r_tar_coord теперь являются списками. Итак, я должен иметь возможность получать доступ к их записям по их индексам. Однако Python выдает следующую ошибку:

 Traceback (most recent call last):
  File "G:test.py", line 22, in <module>
    writer.write(str(r_pos_coord[index]))
IndexError: list index out of range
  

Что я делаю не так, пожалуйста?

Комментарии:

1. q0 имеет len меньше 488 . Когда вы zip , r_pos_coord имеет длину меньше 488. В какой-то момент в вашем цикле возникает ошибка индекса

2. Вы выполнили отладчик и посмотрели, какое значение index было, а также что было в r_pos_coord ?

3. Ошибка не требует пояснений, переданный вами индекс списка находится вне диапазона, т. е. >= len списка, к которому вы пытаетесь получить доступ.

Ответ №1:

q0 имеет len меньше 488 . Когда вы zip , r_pos_coord имеет длину меньше 488. В какой-то момент в вашем цикле возникает ошибка индекса. Вероятно, вы хотите иметь фиксированную длину, чтобы не иметь такого непредсказуемого поведения

Посмотрите на MCVE

 a = [1, 2, 3, 4]
b = [10,20,30]

list(zip(a,b))
  

выход

 [(1,10), (2, 20), (3, 30)]
  

Теперь предположим, что вы хотите выполнить архивирование на основе самого длинного len из обоих массивов. itertools имеет хорошую функцию для этого

 import itertools as it
list(it.zip_longest(a,b))
  

выдает

 [(1, 10), (2, 20), (3, 30), (4, None)]
  

Для списков фиксированной 488 длины, заархивированных с помощью out.txt файлов ввода-вывода с переменными, zip_longest вероятно, это правильный путь.