IndexError: список индексов вне диапазона длины динамической переменной python - PullRequest
0 голосов
/ 15 декабря 2018

Когда я создавал базовый цикл for в Python внутри функции для работы с динамической переменной длины (z), я только что натолкнулся на следующую ошибку:

Rs = []
z = []
N = 120
m = 1
for i in range(1, N):
    Rs[i] = z[m]
    m = m + 1
Rs[i] = z[m]  
IndexError: list index out of range

Ради ясности я лучше объясню, что я пытаюсь сделать.Я хотел бы решить систему уравнений, которая состоит из динамического числа неизвестных.Я начал использовать «статический» метод, и он отлично работает.По сути, код более или менее выглядит следующим образом:

from scipy.optimize import fsolve

def fixEqSyst(z):
    v1 = z[0]
    v2 = z[1]
    v3 = z[2]
    v4 = z[3]
    f=np.zeros(4)
    f[0] = 2*v1-3*v2+7*v3**2
    f[1] = v1+3*v2**2-9*v3
    f[2] = -3v1**2+12*v2+7*v3
    f[3] = 4*v1+5*V2*v3
    return f

z = fsolve(fixEqSyst, [0, 0, 0, 0])

Основываясь на том факте, что теперь я столкнусь с динамическим числом неизвестных и функций, есть ли альтернативное решение, чем то, что я ужеположить на место?(со стратегией цикла)

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Когда вы присваиваете значение массиву в python, элемент уже должен существовать.Когда вы назначаете Rs[i] = z[m], вы назначаете значения вне диапазона списка.Вы можете использовать оператор += в списке, чтобы сделать его достаточно большим, например:

Rs = []
z = []
N = 120
m = 1
for i in range(m+N):
    z += [m+i]
for i in range(N):
    Rs += [z[m]]
    m = m + 1

Обратите внимание, что += может только объединить список в другой список.Так что это будет работать:

mylist = [1, 2, 3]
mylist += [4]

Но это не будет:

mylist = [1, 2, 3]
mylist += 4

Здесь больше для оператора + = в списках.

0 голосов
/ 15 декабря 2018

Просто на первой итерации цикла вы получаете

Rs[1] = z[1]

, но z[1] не существует, потому что z = [].

(То же самое для Rs[1].)

Я понятия не имею, как это исправить, потому что я не могу угадать, что вы хотели выполнить с вашим кодом.

Возможно, вы хотели скопировать содержимое вашего - предположительно, непустого- список z до Rs.Тогда это 2 разных простых решения:

Rs = z   

Внимание! Это не операция копирования, это только связывает другое имя с тем же объектом , поэтому каждое изменение в z приведет к такому же изменению в Rs и наоборот.

Rs = z[:]

Это истинная (но мелкая ) копия.Для простых списков это то же самое, что и deep copy.

...