def has22(nums):
if nums[len(nums) - 1] == 2:
if nums[len(nums) - 2] == 2:
return True
else:
for n in range(len(nums) - 3):
if nums[n] == 2 :
if nums[n + 1] == 2:
return True
else:
return False
如果数组在某个地方包含2,那么我需要返回True。但它给了我一个错误,上面写着:"列出索引超出范围"。我应该改变什么?
我对这些东西很陌生,所以我的代码可能是解决它的最长方法之一,但我感谢任何帮助。谢谢!
答案 0 :(得分:1)
我认为只有在m
为空列表时才会报告您报告的错误。在这种情况下,nums
不是有效索引(因为空列表中没有有效索引)。
对于这个问题,列表中最后两个项目的特殊包装真的没什么意义。通过一个循环处理所有情况,您可以使代码更简单:
nums[len(nums) - 1]
正如评论所说,如果列表的长度小于2,我使用列表索引的循环体将不会运行。这是因为def has22(nums):
for n in range(len(nums) - 1): # the loop body will not run if len(nums) < 2
if nums[n] == nums[n + 1] == 2: # you can chain comparison operators
return True
return False # this is at top level (after the loop), not an `else` clause of the if
将为空,并且迭代空序列什么都没有。
稍微更有趣的方法是在range
的两个迭代器上使用zip
,这两个迭代器被一个地方偏移。这是更高级的Python东西,所以如果你还不了解它,不要太担心它:
num
这种使用def has22_fancy(nums):
iters = [iter(nums), iter(nums)]
next(iters[1], None)
return any(a == b == 2 for a, b in zip(*iters))
迭代对的方法受到itertools
documentation的启发,它在zip
食谱中给出:
pairwise