【问题标题】:IndexError: list index out of range when using lists [duplicate]IndexError:使用列表时列表索引超出范围[重复]
【发布时间】:2012-03-21 12:14:46
【问题描述】:

我正在尝试运行以下脚本,但出现错误

IndexError: list index out of range

我已经读到这是因为当您创建一个列表时,它最初是空的,所以您需要为其分配一些值,我通过执行以下操作完成了该值

q.append(0)

但我仍然收到错误消息。有人可以指出我做错了什么吗?谢谢!

import numpy
from numpy import *
import matplotlib.pyplot as plt

pfa = []                        #Create lists that will hold pf,qf values
qfa = []
pf = []
qf = []
p = []
q = []
pf.append(0)
qf.append(0)
p.append(0)
q.append(0)
q[0]  = -0.5         # initial p and q values
p[0]  = 0
h = 0.001
for i in range(10):

  k1 = -h*sin(q[i])
  j1 = h*(p[i])
  k2 = -h*sin(q[i]+(1/2)*j1)
  j2 = h*p[i]*(q[i]+(1/2)*k1)             
  k3 = -h*sin(q[i]+(1/2)*j2)
  j3 = h*p[i]*(q[i]+(1/2)*k2)
  k4 = -h*sin(q[i]+(1/2)*j3)
  j4 = h*p[i]*(q[i]+(1/2)*k3)
  pf[i+1] = p[i] +(h/6.0)*(k1+2*k2+2*k3+k4)
  qf[i+1] = q[i] +(h/6.0)*(j1+2*j2+2*j3+j4)
  pfa.append(pf)                   #append lists
  qfa.append(qf)

plt.plot(qfa,pfa)
plt.show()

回溯和错误

Traceback (most recent call last):
File "C:\Documents and Settings\My Documents\Symplectic Integrators\RK4_2.py", line  23, in <module>
j1 = h*(p[i])
IndexError: list index out of range

【问题讨论】:

  • 您正在访问q[i],其中i 大于0(这是您的最大索引)。你期望它做什么?只需使用0 作为值?在这种情况下,您首先需要创建一个足够大的列表:qf = [0,0,0,0,0,0,0,0,0,0]qf = [0 for _ in range(10)](它们是等效的)。你也可以defaultdict(int),也许吧。
  • 我将p.append(0) q.append(0) pf.append(0) qf.append(0) 放入循环中,现在我没有收到错误
  • 是的,但仅仅因为它修复了错误,它不一定是正确的方法。最好在循环之前正确初始化列表。
  • @Niklas 你的权利我会试一试
  • @NiklasB.your way works,但我现在在pf[i+1] = p[i] +(h/6.0)*(k1+2*k2+2*k3+k4) IndexError: list assignment index out of range这一行遇到了同样的错误错误,我也按照你对 pf 列表的建议做了。

标签: list indexing python-3.x


【解决方案1】:

您的列表仅包含 一个 元素,并且您正试图访问位置 0 到 9 的成员。考虑一下:

>>> p = []
>>> p.append(0)
>>> p
[0]
>>> for i in range(2):
...     print "position {0}, value {1}".format(p[i], i)
... 
position 0, value 0
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
IndexError: list index out of range

当你做p[i]时,p必须至少有i + 1的大小。

看看你的pf[i] == p[i],它是一个表达式,而不是一个赋值。

也许你需要的是这样的:

pf = []
for i in range(10):
    ...
    # at this point pf.append() assigns to position i

    pf.append(p[i] + (h / 6.0) * (k1 + 2*k2 + 2*k3 + k4))
    ...

但要小心,因为p 需要在for 循环之前包含您需要的所有值。

【讨论】:

  • @Hugo... 感谢您的反馈,我将p.append(0) q.append(0) pf.append(0) qf.append(0) 放在循环中,现在它运行无错误。我将pf[i] == p[i] 用作表达式,因为当我尝试将其作为作业时出现错误。我还编辑了应该是pf[i+1] == p[i]的那一行。
  • @Surfcast23:表达式和赋值做同样的事情。在这种情况下,== 正在查看它们是否相同,但 = 将使 pf[i+1] 成为 p[i] +(h/6.0)*(k1+2*k2+2*k3+k4) 的值——换句话说,您现在拥有的代码对这两行没有任何用处.
猜你喜欢
  • 1970-01-01
  • 2019-09-22
  • 2023-02-08
  • 2021-09-21
  • 2011-10-31
  • 2015-06-26
  • 1970-01-01
相关资源
最近更新 更多