【问题标题】:Why doesn't this if statement work for checking if an array has a specific number?为什么这个 if 语句不能用于检查数组是否具有特定数字?
【发布时间】:2020-09-03 17:02:09
【问题描述】:

给定一个长度为 2 的 int 数组,如果它包含 2 或 3,则返回 True。我不能使用循环。大多数测试用例都有效,除了:

has23([4, 5]) --> False (my code returns True)
has23([7, 7]) --> False (my code returns True)
has23([9, 5]) --> False (my code returns True)

我的代码:

def has23(nums):
  if 2 or 3 in nums[0:1]:
    return True
  else:
    return False

【问题讨论】:

标签: python arrays list int


【解决方案1】:

问题在于if 条件

if 2 or 3 in nums[0:1]

如果23 in nums[0:1] 的任一计算结果为True,您的条件将返回True。在这种情况下,2 将始终评估为 True,因此,您的代码每次都返回 True

旁注: 这种情况还有另一个问题。它会检查数组的第一个元素(不是完整的数组)。 nums[0:1] 返回从第 0 个索引开始到第一个索引之前结束的元素(不包括第一个索引)。所以,在这种情况下,它只会返回第一个元素。

把它改成这样:

if 2 in nums or 3 in nums:

如果2 in nums3 in nums 的计算结果为True,则此条件将返回True(在整个列表中搜索元素)

【讨论】:

    【解决方案2】:

    inor 绑定得更紧密,所以声明2 or 3 in nums[0:1] 等价于2 or (3 in nums[0:1])。由于or 会短路,而2 始终为真,因此永远不会评估后半部分,并且 if 语句始终评估为真。

    比较可以重写为3 in nums or 4 in nums,相当于(3 in nums) or (4 in nums)

    构造:

    if foo:
      return True
    else:
      return False
    

    其中 foo 是一个布尔值等价于:

    return foo
    

    将这些放在一起,函数可以重写为

    def has23(nums):
        return 2 in nums or 3 in nums
    

    【讨论】:

    • 需要注意的是,即使or 绑定得更紧密,表达式仍然不会像 OP 假设的那样工作
    猜你喜欢
    • 2018-03-02
    • 1970-01-01
    • 2013-02-15
    • 2015-12-03
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    相关资源
    最近更新 更多