首页 > 解决方案 > 给定一个整数列表,如果数组在某处的某个 3 旁边包含一个 3,则返回 True

问题描述

我想创建一个函数,如果列表包含两个连续的 3,则返回 True,否则返回 false。使用此代码时它不起作用:

def has_33(x):
    for i in range(len(x)-1):
        if x[i:i+2] == [3,3]:
            return True
        else:
            return False

但是有了这个它可以工作:

def has_33(x):
    for i in range(len(x)-1):
        if x[i:i+2] == [3,3]:
            return True
    return False

对我来说,这是同样的事情,你能向我解释一下为什么吗?

标签: pythonpython-3.x

解决方案


在顶部代码中,您只检查前 2 个索引。在底部代码中,您正在检查整个数组。原因如下:

在上面的代码中,您有一个else条件,这意味着在第一次迭代中,要么if-condition为真(即列表的第一个和第二个元素为 3),要么您将进入该else条件。在任何一种情况下,您都会return在仅检查前 2 个元素后点击语句。

在底部代码中,只有return当你找到一些东西,或者一旦你完成了整个循环

我已经为您的两个函数添加了一些打印语句。您可以运行此代码并查看输出以帮助您了解正在发生的事情:

def has_33_incorrect(x):
  print("\nRunning the incorrect function")
  for i in range(len(x)-1):
    print("Checking indices {} and {}".format(i, i+1))
    if x[i:i+2] == [3,3]:
      print("indices contain 2 consecutive 3's. Returning true")
      return True
    else:
      print("indices don't contain 2 consecutive 3's. Returning false")
      return False

def has_33_correct(x):
  print("\nRunning the correct function")
  for i in range(len(x)-1):
    print("Checking indices {} and {}".format(i, i+1))
    if x[i:i+2] == [3,3]:
      print("indices contain 2 consecutive 3's. Returning true")
      return True
  print("Did not find consecutive 3's. Returning false")
  return False


list = [1, 2, 4, 5, 6, 3, 3, 2, 5]
has_33_incorrect(list)
has_33_correct(list)

推荐阅读