【问题标题】:Python code - List index out of range?Python代码 - 列表索引超出范围?
【发布时间】:2014-12-02 09:44:55
【问题描述】:

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

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

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

认为我已经为可能将我的索引超出范围的所有内容都做了一个 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,并删掉一些不必要的代码:

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

【问题讨论】:

  • 请将您的代码缩减为minimal example 并提供完整的错误回溯。
  • 请告诉我们(通过在调试器中运行,或者只是添加一堆 print 调用)cityatpcitylist 中的内容,并验证它是此代码中的两个直接 [] 表达式,而不是您调用的引发异常的函数之一。
  • 与此同时,您正在到处使用int(p)p 是什么类型?看起来它首先应该是int,这意味着这些调用是不必要的。但是如果它们必要的,那么问题很可能与p 的任何类型有关,可能是它的__index__ 方法或其他东西。
  • 另外,你有像distancebetweencities = distancebetweencitiesp = p 这样的行到处都是,这不可能做任何事情。它们是干什么用的?如果不清楚你的代码应该做什么,就很难修复它来完成它应该做的事情……

标签: python list indexing range out


【解决方案1】:

我不确定这应该如何工作,但这里有一些非常清楚的:

  • 你一直打电话给citylist.pop(),从不添加任何东西,所以它总是越来越小。
  • 你一直在做p += 1,永远不会减少它或将它重置为任何其他值,所以它总是越来越大。
  • 直到citylist 下降到 1 个城市,您才能退出。
  • 每次循环,你都会做一些涉及citylist[p]的表达式。

所以,假设 p 曾经达到 2 或更高(看起来通常会这样),你可以保证最终达到 citylist 少于 p 元素的点,所以下一个 @ 987654328@ 将引发IndexError

问题很可能是您应该在某处减少或重置p,但从来没有。如果我不得不猜测,我猜当你citylist.pop(int(cityat)) 时,如果p &gt;= cityat 你需要p -= 1。但由于我无法理解您的代码应该在做什么,因此我无法确定。

【讨论】:

  • 即使您不理解我的代码,您似乎也理解了错误。已修复且正常工作,p >= cityat 正是它所需要的
猜你喜欢
  • 2019-01-06
  • 1970-01-01
  • 2015-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多