Python代码 - 列表索引超出范围?

时间:2014-10-07 20:42:11

标签: python list indexing range out

对于分配,我们必须使用未提供给我们的城市列表中的地理定位器代码来执行旅行推销员代码,假设列表中的第一个城市是开始/结束城市。

我的代码不完整,但几乎没有,因为我认为我剩下要做的就是从第二个到最后一个城市的距离。

无论如何,我一直在进入超出范围的"列表索引"尝试获取列表中两个城市之间的距离时出现问题。

我已经为所有可能推动我的指数超出范围的事情做了一个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,你是我唯一的希望

编辑: 追溯,并删除一些不必要的代码:

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

1 个答案:

答案 0 :(得分: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。但由于我无法理解你的代码所谓的正在做什么,我真的不能确定。