错误:列表索引超出范围

时间:2016-08-30 06:35:57

标签: python arrays list

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

问题是:“给定一个int数组,如果数组中前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

以下是此问题的当前网址:http://codingbat.com/prob/p110166

有人能指出我做错了吗?

8 个答案:

答案 0 :(得分:1)

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

首先,您应该检查是否len(arr) < 4并返回False

答案 1 :(得分:1)

在问题中给出了数组长度可能小于4.您只是在数组上迭代。您应首先检查array是否至少为length 4。如果array小于4,则只迭代array的长度。

n = 4

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

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

答案 2 :(得分:1)

只需测试此表达式:

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]

那就是全部!

答案 3 :(得分:0)

您使用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]

答案 4 :(得分:0)

更容易解决此问题的方法是:

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)

答案 5 :(得分:0)

您必须获得输入列表的最小检查长度:

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

答案 6 :(得分:0)

问题是“检查列表的前四个数字,看看它们中的任何一个是否为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,因为如果是 - 它会自动使条件失败。

答案 7 :(得分:0)

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

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

def array_front9(arr):

    if 9 in arr[0:4]:

        return True

    return False

我可以看到,无论列表的长度是多少,这个解决方案都可以工作,而且看起来它符合问题的定义,即“无论列表的长度是多少,如果有的话前四个元素等于9,返回True“。