2014-10-07 35 views
-2

對於分配,假設列表中的第一個城市是開始/結束城市,我們必須使用未列出的城市列表中的geolocator代碼來做一個旅行推銷員的代碼。Python代碼 - 列表索引超出範圍?

我的代碼是不完整的,但幾乎沒有,因爲我認爲我所有要做的就是從第二個到最後一個到最初的城市。

無論如何,我試圖在列表中的兩個城市之間的距離時,不斷遇到「列表索引超出範圍」問題。

認爲我已經做了一個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() 

請幫我計算器,你是我唯一的希望

編輯: 回溯,並削減了一些不必要的代碼:

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 2014-10-07 20:48:06

+0

請告訴我們(通過在調試器中運行,或者只是添加一堆'print'調用)'cityat','p'和'citylist'中的內容,並確認它是兩個立即的[]'這個代碼中的表達式並不是你調用引發異常的函數之一。 – abarnert 2014-10-07 21:14:21

+0

同時,你在做'int(p)'到處都是。什麼類型是'p'?它看起來應該首先是一個「int」,這意味着這些調用是不必要的。但是,如果它們是必要的,那麼問題很可能與'p'的類型有關,也可能是'__index__'方法。 – abarnert 2014-10-07 21:15:22

回答

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 2014-10-07 21:38:26