2014-10-07 2 views
-2

Для удобства мы должны сделать код коммивояжера, используя код геолокатора, из списка городов, которые нам не предоставлены, если первый город в списке - это начальный/конечный город.Код Python - индекс индекса вне диапазона?

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

В любом случае, я постоянно сталкиваюсь с проблемой «индекс индекса вне диапазона» при попытке взять расстояние между двумя городами в списке.

I Я сделал инструкцию if/else для всего, что могло вывести мои показатели за пределы диапазона, но я все равно получаю ошибку. Я достаточно новичок в Python, поэтому, пожалуйста, извините мою плохую структуру/синтаксис. Импорт, который у меня есть, является обязательным для этого проекта, поэтому еще раз, пожалуйста, не судите. Ошибка может быть действительно глупой и очевидной, но если это так, у меня проблемы с этим.

#!/usr/bin/env python 
cityfile = open(sys.argv[1], "r") 
citylistwithn = cityfile.readlines() 
citylist = list(map(lambda each:each.strip('\n'), citylistwithn)) 
initcity = 0 

def main(): 
    p = 0 
    distancebetweencities = 1 
    totaldistance = 0 
    cityat = 0 
    while len(citylist) >= 1: 
     currentdistance = vincenty(citycoords(citylist[cityat]), citycoords(citylist[p])).miles 
     if currentdistance > distancebetweencities: 
      distancebetweencities = currentdistance 
      if int(p) < len(citylist)-1: 
       p += 1 
      else: 
       p = p 
     elif currentdistance < distancebetweencities: 
      distancebetweencities = distancebetweencities 
      if int(p) < len(citylist)-1: 
       p += 1 
      else: 
       p = p 
     elif currentdistance == distancebetweencities: 
      totaldistance += distancebetweencities 
      citylist.pop(int(cityat)) 
      if int(p) >= 1: 
       cityat = int(p) - 1 
      else: 
       cityat = int(p) 
    print(totaldistance) 
main() 

Пожалуйста, помогите мне StackOverflow, ты моя единственная надежда

EDIT: Traceback, и вырезать некоторые ненужный код:

Traceback (most recent call last): 
    File "/home/user/assignment6.py", line 43, in <module> 
    main() 
    File "/home/user/assignment6.py", line 22, in main 
    currentdistance = vincenty(citycoords(citylist[cityat]), citycoords(citylist[p])).miles 
IndexError: list index out of range 
+0

Пожалуйста, сократите свой код до [минимального примера] (http://stackoverflow.com/help/mcve) и обеспечите полную отслеживание ошибок. – jonrsharpe

+0

Пожалуйста, сообщите нам (запустив в отладчике или просто добавляя кучу вызовов 'print'), что находится в' cityat', 'p' и' citylist', и убедитесь, что это один из двух непосредственных '[]' выражения в этом коде, а не одну из функций, которые вы вызываете, что создает исключение. – abarnert

+0

Между тем, вы делаете 'int (p)' повсюду. Какой тип 'p'? Похоже, что это должно быть «int» в первую очередь, что означает, что эти вызовы не нужны. Но если они необходимы, то проблема, скорее всего, связана с любым типом 'p', может быть, с его методом' __index__' или чем-то еще. – abarnert

ответ

0

я не уверен, как это предполагается чтобы работать, но вот что-то довольно ясно:

  • Вы продолжаете звонить citylist.pop(), и никогда ничего не добавляйте к нему, поэтому он всегда становится меньше.
  • Вы продолжаете делать p += 1 и никогда не уменьшаете его или не возвращаете его к какому-либо другому значению, поэтому он всегда становится больше.
  • Вы не выходите до citylist до 1 города.
  • Каждый раз, проходя через цикл, вы делаете какое-то выражение с участием citylist[p].

Так, если предположить, p когда-либо получает 2 или выше (который, кажется, как это обычно будет), вы гарантированно в конечном итоге попасть в точку, где citylist имеет меньше p элементов, поэтому следующий citylist[p] возбудит IndexError.

Скорее всего, проблема заключается в том, что вы должны снижать или перезагружать p где-то, но никогда не были. Если бы я должен был догадаться, я бы предположил, что когда вы citylist.pop(int(cityat)), если p >= cityat вам нужен p -= 1. Но так как я не могу понять, что ваш код предположил, что делать, я не могу быть в этом уверен.

+0

Даже если вы не поняли мой код, вы, похоже, поняли ошибку. Исправлено и работает, что p> = cityat было тем, что ему нужно – Wakeen

Смежные вопросы