#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
вероятно, это правильный путь.