【发布时间】: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