列表索引超出范围 - CodingBat 问题 - Has22

DOB*_*OBS 0 python list range python-3.x

问题就在这里。

\n

这是List-2 的一部分

\n

中型 python 列表问题——1 个循环。

\n
    \n
  • 给定一个整数数组,如果该数组某处的 2 旁边包含 2,则返回 True。

    \n

    has22([1, 2, 2]) \xe2\x86\x92 真
    \nhas22([1, 2, 1, 2]) \xe2\x86\x92 假
    \nhas22([2, 1, 2]) \xe2 \x86\x92 假

    \n
  • \n
\n
\n

我一开始收到错误“列表索引超出范围”

\n

我知道原来问题的第 4 行哪里出了问题,因为一旦它到达列表中的最后一个数字,它就无法再添加一个了。

\n

我在下面提供了我的原始代码。第一个代码块是当我收到错误“索引超出范围”时。第二种解决方案有效,但我想知道是否有更干净的编写方式。

\n

另外,在 CodingBat 上,当我运行我的解决方案时,它在底部显示“其他测试”失败,但没有示例,我不确定这意味着什么。

\n

谢谢

\n

这是我的代码块 - 第一次尝试:

\n
def has22(nums):\n    for i in range(len(nums)):\n        first = nums[i]\n        second = nums[i+1]\n    if first == second:\n    return True\n
Run Code Online (Sandbox Code Playgroud)\n

我的解决方案:

\n
def has22(nums):\n    size = len(nums)\n    for i in range(len(nums)):\n        first = nums[i]\n        if size >= i+2:\n            second = nums[i+1]\n        if first == second:\n            return True\n    return False\n
Run Code Online (Sandbox Code Playgroud)\n

rad*_*doh 5

因此,如果问题是解决方案是否可以写得更干净,我认为这样的事情应该有效:

def has22(nums):
    return (2, 2) in zip(num, num[1:])
Run Code Online (Sandbox Code Playgroud)

而且看起来很干净。

一点解释 -zip从 2 个列表创建值对,因此我只是将输入列表切成 2 个,在第二个列表中我省略了第一个元素。然后我简单地检查压缩2, 2对中是否存在元组。

顺便说一句,我刚刚注意到您的解决方案中的一个错误 - 它返回True输入例如[2, 1](基本上是任何输入,其中2是倒数第二个。因此,要修复此错误并保留解决方案的原始“想法”,您可以这样写:

def has22(nums):
   for i, el in enumerate(nums):
       if el == 2 and i + 1 < len(nums) and nums[i + 1] == 2:
           return True
   return False
Run Code Online (Sandbox Code Playgroud)

enumerate是迭代带有索引的列表的首选方式。