【问题标题】:I have two practically identical "for loop" functions, but only one of them works. Why is that?我有两个几乎相同的“for循环”函数,但只有一个有效。这是为什么?
【发布时间】:2019-01-12 08:08:35
【问题描述】:

我正在学习 Python 中的循环,我正在尝试创建一个函数,该函数采用 2 个相同长度的列表,如果 lst1 与 lst2 反转时返回 True(否则返回 false)。

例如:reversed_list([1, 2, 3], [3, 2, 1]) 应该返回 True。

下面有两种几乎相同的方法来编写这个函数,我认为它们都应该可以正常工作,但第二种方法不起作用,即使它与第一种几乎相同。

def reversed_list(lst1, lst2):
    for index in range(len(lst1)):
        if lst1[index] != lst2[len(lst2) - 1 - index]:
            return False
    else: return True
#tests
print(reversed_list([1, 2, 3], [3, 2, 1]))
#output = True (correct)
print(reversed_list([1, 2, 3], [4, 2, 1]))
#output = False (correct)






def reversed_list(lst1, lst2):
    for index in range(len(lst1)):
        if lst1[index] == lst2[len(lst2) - 1 - index]:
            return True
    else: return False
#tests
print(reversed_list([1, 2, 3], [3, 2, 1]))
#output = True (correct but it outputs True even if it should be False)
print(reversed_list([1, 2, 3], [4, 2, 1]))
#output = True (incorrect)

这两个函数之间的唯一区别是我将 != 更改为 == 并相应地交换了 True/False。然而,第二个函数总是返回 True,即使它应该是 False。我怀疑这与循环有关。请解释为什么第二个功能不能正常工作。

【问题讨论】:

  • 这是因为您在评估列表中的第一个元素后返回的第二个函数。 return 在这里打破了循环,所以只有当所有元素都相等时它才应该是 True 。顺便说一句,for 循环不是创建此函数的最佳方法。
  • 我知道这不是你想要的,但为了你将来的参考,一个更 Pythonic 的方式来做你的循环是使用all(a == b for a, b in zip(lst1, reversed(lst2))。你的第一个函数直接等同于not any(a != b for a, b in zip(lst1, reversed(lst2)),而第二个函数只是去掉了not,将!=更改为==,实际上它还需要将any切换为all
  • ^ 这个。 not any(x) 的等价物是 all(not x) (De Morgan),但早期返回循环始终是 any

标签: python python-3.x


【解决方案1】:

如果发现两个不匹配的条目,第一个提前停止并返回False;否则返回True。第二个提前停止并在找到两个匹配的条目后立即返回True - 但您的任务是验证所有条目,而这在仅验证一个后停止。它基本上是检查是否至少有一个匹配项,而不是检查整个列表是否匹配。

【讨论】:

【解决方案2】:

第二个函数的问题是该函数一旦找到匹配项就会停止运行,而不是检查所有值并在找到不匹配的对时停止运行。

在你的情况下 [1, 2, 3] vs [4, 2, 1]

当这两行运行时:

if lst1[index] == lst2[len(lst2) - 1 - index]:
    return True

第二个函数在index == 0 时到达第一对项目,发现lst[0] 的值为1,而lst2[len(lst2) - 1 - 0] 的值也为1。它们确实匹配,因此该函数返回 true。它实际上永远无法将34进行比较

如果您想了解更多信息,请查看所谓的快速失败算法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 2021-07-16
    • 2011-06-28
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多