CodingBat有22为什么这个解决方案错了?

时间:2016-08-27 21:42:34

标签: python

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。但它给了我一个错误,上面写着:"列出索引超出范围"。我应该改变什么?

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

1 个答案:

答案 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