【发布时间】:2018-05-17 23:27:20
【问题描述】:
在过去,我们在遍历列表时使用“找到”变量来表示您找到了匹配项。现在有使用带有 for 循环的“else”来消除使用“found”变量的 Pythonic 构造。例如,这很好用:
l = [1, 2, 3]
magic_number = 4
for n in l:
if n == magic_number:
print("Magic number found")
break
else:
print("Magic number not found")
但是,我有一个嵌套的 for 循环,并且我需要存储第二个数组(下面的 m)中不存在但第一个数组(下面的 l)中存在的所有项目。我只是不确定如何实施这个结构。我不想(如果我不必)使用“找到”变量...有什么想法吗?
l = [1, 2, 3]
m = [4, 5, 6]
not_found = list()
for n in l:
for o in m:
if n == o:
print("Found a match")
break
else:
print("No match found")
not_found.append(o)
【问题讨论】:
-
最好只使用列表理解:
not_found = [o for o in m if o not in l] -
你在这里说的是“过去”和“现在”吗?
for…else…至少从 1991 年第一次公开发布以来就一直在 Python 中。 -
我有点困惑,您的第二个代码块是否按您想要的方式工作?如果没有,你应该真正说出它在做什么,以及你想要什么。
-
无论如何,虽然
else可以与嵌套循环一起使用,但它只有在您突破该级别时才对每个级别有用。似乎您不想突破外层,因为您想找到所有匹配项而不是没有匹配项,因此else无能为力。不是因为里面嵌套了另一个while,只是因为你没有任何中断逻辑。但是您也不需要标志,因为您已经保留了一个列表。如果列表不为空,则列表为真。
标签: python python-3.x anti-patterns