2016-08-27 103 views
-1
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 

我需要返回True,如果数组包含2旁边的2某处。但它给了我一个错误:“列表索引超出范围”。我应该改变什么?CodingBat has22为什么这个解决方案是错误的?

我很新的东西,所以可能我的代码是最长的解决方法之一,但我感谢任何帮助。谢谢!

+0

你能否粘贴整个错误? – Bharel

回答

1

我认为只有nums是一个空列表时,您报告的错误才会发生。在这种情况下,nums[len(nums) - 1]不是有效的索引(因为没有有效的索引进入空列表)。

对于这个问题,真的没有太多的意思要特别封闭列表中的最后两项。你可以让你的代码更通过处理所有的情况下用一个简单的循环:

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 

正如评论说,在这里我用列表索引循环体将无法运行,如果该列表的长度小于2这是因为range将是空的,并且在空序列上迭代不会做任何事情。

稍微更有趣的方法是在两个迭代器num上使用zip,它们被一个位置偏移。这是更高级的Python的东西,所以如果你不明白的是,不要过分担心它:

def has22_fancy(nums): 
    iters = [iter(nums), iter(nums)] 
    next(iters[1], None) 
    return any(a == b == 2 for a, b in zip(*iters)) 

这种方法来遍历使用zip对由itertools documentation,它给了启发在pairwise食谱:

def pairwise(iterable): 
    "s -> (s0,s1), (s1,s2), (s2, s3), ..." 
    a, b = tee(iterable) 
    next(b, None) 
    return zip(a, b) 
相关问题