消除for循环中的“found”变量

时间:2018-05-17 23:27:20

标签: python python-3.x anti-patterns

在过去,我们在迭代列表时使用'found'变量来表示您找到了匹配项。现在有一个pythonic构造,使用带有for循环的'else'来消除使用'found'变量。例如,这很好用:

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)

2 个答案:

答案 0 :(得分:3)

如果您希望l中的所有元素都不在m中,您可以理解(如@PatrickHaugh建议的那样)或设置操作。

理解:

>>> l = [1, 2, 3]
>>> m = [4, 5, 6]
>>> [o for o in l if o not in m]
[1, 2, 3]

如果您更喜欢使用固定操作:

>>> l = {1, 2, 3}
>>> m = {4, 5, 6}
>>> l - m
{1, 2, 3}
>>> l = {1, 2, 3, 4}
>>> l - m
{1, 2, 3}

请注意,此处lmsets

答案 1 :(得分:0)

有几种方法可以做到这一点。

最干净,最有效的方法实际上可能是使用set。 E.g。

l = {1, 2, 3}
m = {4, 5, 6}
not_found = m - l

如果日志记录对您很重要,请计算使用in密钥世界:

l = [1, 2, 3]
m = [4, 5, 6]

not_found = list()

for o in m:
   if o in l:
       print("Found a match")
   else:
       print("No match found")
       not_found.append(o)

另外,我假设你的最后一行没有正确缩进。目前,您的示例将提供not_found = [6, 6, 6]