【问题标题】:For-loop error: list index out of rangeFor-loop 错误:列表索引超出范围
【发布时间】:2018-03-24 00:16:10
【问题描述】:

所以我对编程比较陌生,最近才开始使用类,我们应该制作一个可以加载到单独文本文件中的电话簿。

然而,当我进入 for 循环时,我在本节中一直遇到问题。它撞到了一堵砖墙

if storage[2] == permaStorage[i].number:

并告诉我“IndexError: list index out of range”。我几乎可以肯定这是由于 permaStorage 一开始是空的,但即使我尝试用电话簿的临时实例填充它,它也会告诉我它超出了范围。它存在的主要原因是检查 permaStorage 中是否已经存在电话号码。

有人对如何解决或解决这个问题有很好的建议吗?

(如果文字写得不好,请见谅。刚加入这个网站,不知道风格)

class Phonebook():
  def __init__(self):
      self.name = ''
      self.number = ''

def Add(name1, number1):
  y = Phonebook()
  y.name = name1
  y.number = number1
  return y

def Main():
  permaStorage = []
  while True:
      print " add name number\n lookup name\n alias name newname\n change name number\n save filename\n load filename\n quit\n"
      choices = raw_input ("What would you like to do?: ")
      storage = choices.split(" ")
      if storage[0] == "add":
          for i in range(0, len(permaStorage)+1):
              if storage[2] == permaStorage[i].number:
                  print "This number already exists. No two people can have the same phonenumber!\n"
                  break
              if i == len(permaStorage):
                  print "hej"
                  try:
                      tempbox = Add(storage[1], storage[2])
                      permaStorage.append(tempbox)
                  except:
                      raw_input ("Remember to write name and phonenumber! Press any key to continue \n")

【问题讨论】:

  • 为什么 len(permaStorage)+1for i in range(0, len(permaStorage)+1):
  • 我将其添加为具有等于 permaStorage 长度的定义范围。 +1 是为了让它首先开始,但很可能没有必要,以后会引起问题。

标签: python-2.7 list class for-loop


【解决方案1】:

我认为问题是 permaStorage 是空列表,然后你尝试:

for i in range(0, len(permaStorage)+1):
          if storage[2] == permaStorage[i].number:

将导致错误,因为 permaStorage 有 0 个项目,但您尝试获取第一个 (i=0, permaStorage[0]) 项目。

我认为你应该用第一个替换第二个 if 子句:

for i in range(0, len(permaStorage)+1):    
    if i == len(permaStorage):
              print "hej"
              try:
                  tempbox = Add(storage[1], storage[2])
                  permaStorage.append(tempbox)
    if storage[2] == permaStorage[i].number:
              print "This number already exists. No two people can have the same phonenumber!\n"
              break

所以在这种情况下,如果 perStorage 为空,您将附加一些值,然后下一个 if 子句就可以了。

【讨论】:

  • 谢谢!它确实有效,但是它确实导致了一个小问题,在第二部分它打印出“他的号码已经存在。没有两个人可以拥有相同的电话号码!\n”但这是一个很容易解决的小问题。
  • 是的,你可以在 for 循环开始时添加额外的验证,而不是“permaStorage”为空,例如:如果不是 permaStorage: tempbox = Add(storage[1], storage[2] ) permaStorage.append(tempbox)
【解决方案2】:

您应该迭代到列表的最后一个元素,而不是超出。

试试 -

for i in range(0, len(permaStorage)):

range()中产生的数字列表是从头开始的,但不包括结尾,所以range(3) == [0, 1, 2]

因此,如果您的列表 x 的长度为 10,range(0, len(x)) 将为您提供 0 到 9,这是列表元素的正确索引。

1 添加到len(x) 将产生0 through 10 范围,当您尝试访问x[10] 时,它将失败。

【讨论】:

    【解决方案3】:

    在 python 中索引从零开始。因此,长度为 5 的列表的最后一个元素索引为从 0 开始的 4。将范围更改为 range(0, len(permastorage))

    【讨论】:

    • 谢谢!遗憾的是,它并没有解决问题,因为 permaStorage 的长度开始为空。它遇到的错误是它尝试检查if storage[2] == permaStorage[i].number:
    • 你也可以像for elem in permastorage: #Do stuffs with elem if storage[2] == elem.number这样对列表进行迭代。尝试一下。
    • 它没有用。它完全跳过了整个循环。它遇到的主要问题是何时以及是否循环开始(例如当它是len(permaStorage)+1时,它是列表索引超出范围。它检查是否storage[2] == permaStorage[i].number的部分
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    相关资源
    最近更新 更多