【问题标题】:Error:list index out of range错误:列表索引超出范围
【发布时间】:2016-08-30 06:35:57
【问题描述】:

我是 Python 和一般编程的初学者,我正在尝试解决 codingbat.com 上的一个问题(该问题在“Warmup-2”部分下称为“array_front9”)。

问题是:“给定一个整数数组,如果数组中的前 4 个元素之一是 9,则返回 True。数组长度可能小于 4。”

这是我的代码,如果我创建一个列表然后在本地运行它(在 codingbat.com 上需要创建一个函数,但我没有创建一个函数来在本地测试我的代码):

arr = [14,9,28,55,66,33,789,4548]

    for i in range (4):

        if arr[i] == 9:

            print('True')

    print('False')*

这是我试图在 codingbat.com 上运行的代码,但我收到“错误:列表索引超出范围”错误:

def array_front9(arr):

    for i in range(4):

        if arr[i] == 9:

            return True

     return False

这里是根据codingbat.com的解决方案:

def array_front9(nums):
  # First figure the end for the loop
      end = len(nums)
          if end > 4:
              end = 4

for i in range(end):  # loop over index [0, 1, 2, 3]
    if nums[i] == 9:
      return True
    return False

这是此问题的当前 URL:http://codingbat.com/prob/p110166

谁能指出我做错了什么?

【问题讨论】:

  • codingbat.com 代码和你的代码的主要区别是return False 语句。 codingbat.com return False 在 for 循环内,而在您的代码中 return False 在 for 循环外。有很多更好的方法可以做到这一点。你可以检查if 9 in arr[0:4]
  • 我真的很喜欢 IF 循环解决方案!
  • 我也提供了一个基于此的答案,如果你喜欢它并且对你有用,请点赞/接受它作为答案。

标签: python arrays list


【解决方案1】:

问题中给出的数组长度可能小于4。你只是在迭代一个数组。您应该首先检查array 是否至少是length 4。如果 array 小于 4,则仅遍历 array 的长度。

n = 4

if len(arr) < 4:
    n = len(arr)

for i in range(n):
    #...Your code...

【讨论】:

  • 您可以删除所有代码行并输入:for item in arr:
  • 是的,但问题特别要求您只检查前 4 个元素。所以我在想,当只需要前 4 个元素时,为什么还要浪费时间遍历所有元素。
【解决方案2】:

问题指出“数组长度可能小于 4”。您的代码当前假定数组长度至少为 4。但是,如果 i 大于列表的最后一个索引,则会抛出 IndexError。

你应该先检查是否len(arr) &lt; 4,如果是则返回False。

【讨论】:

    【解决方案3】:

    简单地测试这个表达式:

    9 in arr[:4]
    

    我解释一下:

    正如其他人指出的那样,您的数组可能少于 4 个项目,在这种情况下,在第四个数字 3 处进行索引将引发 IndexError。

    但是让我们使用slicing不会引发异常的特性,即:

    In [232]: a = [1, 2]
    
    In [233]: a[:10]
    Out[233]: [1, 2]
    

    在上面的示例中,我从数组的开头到第 10 项取了一个切片,没有得到异常,但 Python 返回了整个列表。

    因此,您可以像这样简单地进行检查:

    9 in arr[:4]
    

    仅此而已!

    【讨论】:

    • 这是一个复杂的解决方案。当然不是一个坏的。但对于初学者。
    • 很多初学者教程都没有处理“in”。切片可能也不是。
    【解决方案4】:

    您使用range(4)。所以它总是会寻找 4 个数字。所以当只有三个数字时,它仍然会寻找第四个数字。第四个不存在,因此会引发错误。

    相反,您需要查看列表的长度,然后迭代该长度。

    像这样:

    for i in range(len(arr)): 
        if arr[i] == 9:
    

    或者更简单,您可以像这样遍历列表:

    for list_item in arr:
        if list_item == 9:  # you don't even have to use the [i]
    

    【讨论】:

      【解决方案5】:

      你必须得到输入列表的最小检查长度:

      def array_front9(nums):
          return 9 in nums[:min(4,len(nums))]
      

      【讨论】:

        【解决方案6】:

        这个问题的更简单的解决方案是:

        if len(arr) > 4:
            if 9 in arr[0:4]:
                return True
            else:
                return False
        else:
            print('Array length is shorter than 4')
            return False
        

        如果要检查9,即使列表长度小于4,那么解决方法如下:

        def check(arr):
            max = 4 if len(arr) >= 4 else len(arr)
        
            if 9 in arr[0:max]:
               return True
            else:
                return False
        
        print check(arr)
        

        【讨论】:

        • 这仅在列表大于四个时才有效
        • 它也应该适用于小于或等于四个的列表。
        • @TristanT,我最初是在检查列表内部之前检查数组的长度。只有当它大于 4 时,我才会进入内部。
        • @TristanT,我添加了一个编辑来处理长度小于 4 的列表。请检查并投票/删除投票
        【解决方案7】:

        感谢您的所有回答,他们真的很有帮助!

        我决定使用 IF 循环而不是 FOR 循环,如下所示:

        def array_front9(arr):
        
            if 9 in arr[0:4]:
        
                return True
        
            return False
        

        据我所知,无论列表的长度是多少,此解决方案都有效,而且它似乎符合问题的定义,即“无论列表的长度是多少,如果有任何前四个元素等于 9,返回 True”。

        【讨论】:

          【解决方案8】:

          问题是“检查列表的前四个数字,看看它们是否是9”。

          现在,如果列表小于 4,则自动检查将失败:

          if len(arr) < 4:
            return false
          

          接下来,您需要检查前四项是否包含九项。有很多方法可以做到这一点,最简单的一种是:

          for i in arr[:4]:
            if i == '9':
               return true
          

          将两者结合起来:

          def check_for_nine(arr):
          
            if len(arr) < 4:
               return false
          
            for i in arr[:4]:
              if i == '9':
                 return true
          

          您最初方法的问题是您将长度强制为 4,并假设数组至少有 4 个元素。如果数组有 3 个元素,那么您的代码将不起作用。

          为避免这种情况,请不要假设特定的长度。如果您使用切片,则保证您将获得最多 4 个 项。

          这是一个例子:

          >>> i = [1,2]
          >>> i[:4]
          [1, 2]
          

          即使 i 只有两个项目,切片到 4 也可以工作并且不会引发错误。一旦i超过4项,将限制为前四项:

          >>> i = [1,2,3,4,5,6,7,8]
          >>> i[:4]
          [1, 2, 3, 4]
          

          但是,我们的问题陈述中明确表示要检查前四项是否包含 9。如果我们只是使用切片技巧,像这样:

          for i in arr[:4]:
              if i == '9':
                 return true
          

          即使我们向它传递一个像 ['1','9'] 这样的数组,它也会返回 true,因为切片将始终有效。

          为了捕捉这个条件 - 我们首先检查列表的长度是否小于 4,因为如果是 - 它会自动使条件失败。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-10-30
            • 1970-01-01
            • 1970-01-01
            • 2021-05-12
            • 1970-01-01
            • 2016-01-06
            • 2021-06-08
            相关资源
            最近更新 更多