【问题标题】:Eliminating a "found" variable in a for loop消除 for 循环中的“找到”变量
【发布时间】: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


【解决方案1】:

如果您想要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

【讨论】:

    【解决方案2】:

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

    最干净和最有效的方法实际上可能是使用sets。例如

    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]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-16
      • 2021-07-14
      • 1970-01-01
      • 2014-01-29
      • 1970-01-01
      • 2017-06-20
      • 1970-01-01
      相关资源
      最近更新 更多