【问题标题】:Python IndexError: List index out of range (sweep algorithm)Python IndexError:列表索引超出范围(扫描算法)
【发布时间】:2017-03-27 03:55:17
【问题描述】:

我的代码有问题,显示错误:

File "C:\Users\gileu\Google Drive\FIME\Temas Selectos de Optimización\Heuristica de Barridos\Barridos.py", line 85, in <module>
        elif(datos[j][2] <= ca):
    IndexError: list index out of range

我尝试手动显示我应该比较的值并且它可以工作,但是当它在 if 语句中使用时,它会崩溃。

代码如下:

import sys
from math import *
'''Inicialización: Obetener los datos necesarios para la funcionalidad del programa.
El formato del dato individual debe ser transformado al siguiente formato:
dato[i] = [x,y,d] donde:
x = coordenada x del dato
y = coordenada y del dato
d = demanda a atender del dato '''
datos = [[0,1,33],[1,0,15],[-1,1,10],[-1,-1,10],[1,1,20],[0,-1,17],[1,-1,13],[-1,0,9]]

#El origen pertenecerá a todos los grupos creados, y se tomará como el origen. 
Or = [0,0]

#La capacidad de cada grupo debe ser mayor que el máximo de todas las demandas, esto para poder antende las necesidades de todos los datos.
c = 80

ang = []
angO = []
grupos = []

print("Paso 1: Conseguir los grados de cada punto.")
print()

for i in range(len(datos)):
    #Cuadrante II:
    if(datos[i][0] < 0 and datos[i][1] > 0):
        ang.append(degrees(atan(datos[i][1]/datos[i][0]))+180)
        angO.append(degrees(atan(datos[i][1]/datos[i][0]))+180)
    #Cuadrante III:
    elif(datos[i][0] < 0 and datos[i][1] < 0):
        ang.append(270-degrees(atan(datos[i][1]/datos[i][0])))
        angO.append(270-degrees(atan(datos[i][1]/datos[i][0])))
    #Cuadrante IV:
    elif(datos[i][0] > 0 and datos[i][1] < 0):
        ang.append(degrees(atan(datos[i][1]/datos[i][0]))+360)
        angO.append(degrees(atan(datos[i][1]/datos[i][0]))+360)
    #Eje Y:
    elif(datos[i][0] == 0 and datos[i][1] > 0):
        ang.append(90)
        angO.append(90)
    #Eje -X:
    elif(datos[i][0] < 0 and datos[i][1] == 0):
        ang.append(180)
        angO.append(180)
    #Eje -Y:
    elif(datos[i][0] == 0 and datos[i][1] < 0):
        ang.append(270)
        angO.append(270)
    #Eje X:
    elif(datos[i][0] > 0 and datos[i][1] == 0 or datos[i][0] == 0 and datos[i][1] == 0):
        ang.append(0)
        angO.append(0)
    #Para cualquier otro ángulo:
    else:
        ang.append(degrees(atan(datos[i][1]/datos[i][0])))
        angO.append(degrees(atan(datos[i][1]/datos[i][0])))

print("Paso 2: Ordenar los ángulos de menor a mayor.")
print()
angO.sort()

print("Coordenadas en posicion original: ", ang)
print("Coordenadas en posicion ordenada: ", angO)

print()
print("Paso 3: Proceso de asignación.")
print()

i = 0
j = 0
while(angO):
    grupos.append([])
    print(grupos[i])
    ca = c
    print("Capacidad Actual: ", ca)
    print("Numeros por asignar: ", angO)
    print("Grupo actual: ", i)
    print("Numero actual: ", j)
    print(datos[j][2])
    print(ang.index(angO[0]))
    while(ca>=0):
        if(ca == 0):
            i = i + 1
            break
        elif(datos[j][2] <= ca):
            grupos[i].append(ang.index(angO[0]))
            angO.remove(angO[0])
            j = j + 1
        elif(datos[j][2] > ca):
            i = i + 1
            break

for i in range(len(grupos)):
    print("Grupo ", i, ": ", grupos[i])

【问题讨论】:

  • 欢迎您,Gilberto,如果能发布完整的错误跟踪信息,包括源代码位置,那就太好了。您介意更新您的帖子以符合此标准做法吗?
  • @user3666197 我已经更新了帖子。谢谢推荐!

标签: python algorithm list loops while-loop


【解决方案1】:

问题似乎出在这部分代码中:

while(ca>=0):
    if(ca == 0):
        i = i + 1
        break
    elif(datos[j][2] <= ca):
        grupos[i].append(ang.index(angO[0]))
        angO.remove(angO[0])
        j = j + 1
    elif(datos[j][2] > ca):
        i = i + 1
        break

你已经初始化了ca=c,也就是80。在这个while循环中,你永远不会减少ca,所以这本质上是一个无限循环。虽然len(datos) 的值是有限的,但如果j 的所有值都满足datos[j][2] &lt;= ca,则j 将在某个时刻超过datos 的长度,这将导致IndexError: list index out of range 错误。

您需要在此处为​​j 设置条件。

【讨论】:

  • 我忘了减少ca!让我看看这是否修复了代码。
  • 谢谢!我最终以这种方式验证:if(j &lt; len(angO)): j = j + 1
  • 是的,我是这么认为的……j 一定有一些条件,因为它小于len(datos)len(ang0),无论适合什么。
猜你喜欢
  • 2016-12-08
  • 1970-01-01
  • 2016-08-25
  • 2017-04-05
  • 2012-07-15
  • 2013-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多