索引超出范围(python if循环)

索引超出范围(python if循环),python,loops,Python,Loops,大家好,谢谢阅读 我必须开始运行一段我没有编写的代码,这是我第一次使用python。代码每天都在工作,提取我们每天下载的一些气象数据。由于原始数据发生了一些变化,我不得不修改代码,基本上是修改一些ID以获得所需变量的新位置 但现在又出现了另一个问题,在一个循环中,我得到了这个错误消息 ('XXX', 19, 368, 124, 130) ('YYY', 19, 368, 0.0, 130, 2.49e+19, 0.25) ('XXX', 20, 382, 124, 130) ('YYY', 20

大家好,谢谢阅读

我必须开始运行一段我没有编写的代码,这是我第一次使用python。代码每天都在工作,提取我们每天下载的一些气象数据。由于原始数据发生了一些变化,我不得不修改代码,基本上是修改一些ID以获得所需变量的新位置

但现在又出现了另一个问题,在一个循环中,我得到了这个错误消息

('XXX', 19, 368, 124, 130)
('YYY', 19, 368, 0.0, 130, 2.49e+19, 0.25)
('XXX', 20, 382, 124, 130)
('YYY', 20, 382, 0.0, 130, 2.55e+19, 0.0)
('XXX', 21, 398, 124, 130)
Traceback (most recent call last):
  File "/home/meteo/UVI/TREBALL/input-make-erythem.py", line 125, in <module>
    auxcm=float(lista[j][(auxcm+4):len(lista[j])])*28.9645*dens[i]/(6.023e17)
IndexError: list index out of range
len(lista)=512
alt和DEN有21个元素


提前感谢您的帮助

我想问题在于调用
dens[I]
的问题,因为此时
I
是21,但是
dens
的长度是21(除非我不能正确计数),因此索引超出了范围,哪个是错误索引器:列出索引超出范围的内容
打印什么(“XXX”,i,j,auxcm,len(lista[j])
显示什么

i
的值很可能是问题的根源。如果
lista
中有超过21个条目可以找到“CLWMR”,则
i
的增量将破坏
dens
列表(即
i
将>=21)

您可以通过将
和i
添加到条件中来忽略额外的“CLWMR”条目,或者通过添加另一个来报告错误,如果这表明问题并中断循环


这也可能意味着您需要在dens/alt列表中添加更多条目,或者您的数据有缺陷。

因此,它应该在我20岁时停止。我该怎么强制呢?这取决于你的代码到底想实现什么。如果正在计数的
i
可以忽略第21个元素(因此,如果您只计算
dens
),则打破循环。它还取决于如何使用
i
。你可以分享更多关于这个的代码吗?
i
只是用来读取dens,在代码中不再出现,然后你可以在for循环的开始添加语句:
if i==21:break
。然而,从下面的答案来看,您最好增加
dens
,以便覆盖CLWMR。您也可以在
i=i+1
之后添加条件,或者在它之前添加条件,如果i==20:break
您可能是对的,CLWMR有23个值,因此我想我必须向
dens
alt添加两个额外的值。如果您这样做,我建议您也确保数据的顺序(云混合比线)匹配两个列表中的海拔和密度值。额外的条目不一定在开始或结束处。事实上,这可能是一个完全不同的分层。如果海拔在数据中的某个位置,我建议使用它来查找列表中相应的密度,而不是依赖输入d的顺序ata.是的,我必须检查模型标高的高度和密度(mb),并正确设置密度值列表。
alt=[16,14,12,10,9,8,7,6,5,4.5,4,3.5,3,2.5,2,1.5,1,0.75,0.5,0.25,0.0]
#1/cm3
dens=3.460E+18,4.74E+18,6.48E+18,8.59E+18,9.71E+18,1.09E+19,1.23E+19,1.37E+19,1.55E+19,1.64E+19,1.73E+19,1.81E+19,1.93E+19,1.97E+19,2.00E+19,2.15E+19,2.30E+19,2.36E+19,2.42E+19,2.49E+19,2.55E+19]


print("lenlista",len(lista))
for j in range(len(lista)):
    auxcm=lista[j].find("CLWMR")

    if -1 != auxcm:
         auxcm=lista[j].find("val=")
         print("XXX",i, j, auxcm, len(lista[j]))
         auxcm=float(lista[j][(auxcm+4):len(lista[j])])*28.9645*dens[i]/(6.023e17)
         print("YYY",i, j, auxcm, len(lista[j]),dens[i],alt[i])
         cm.write("      "+str(alt[i])+"     ")
         cm.write(str(auxcm))
         cm.write("    10.0\n") #radio estandar de gota de nube en um (variacion de 2 um --> 5%)
         i=i+1