str (list [index]): IndexError: список индексов вне диапазона - PullRequest
1 голос
/ 06 апреля 2019

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

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 Ответ

2 голосов
/ 06 апреля 2019

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

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

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

list(zip(a,b))

yield

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

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

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

дает

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...