我是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
有人能指出我做错了吗?
答案 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“。