【问题标题】:I am trying to find all matching answers in a list but it isn't working [duplicate]我正在尝试在列表中找到所有匹配的答案,但它不起作用[重复]
【发布时间】:2021-04-08 14:06:57
【问题描述】:

我正在自学编程。在我的代码中,我正在练习嵌套循环,并且正在做一个练习,看看我是否可以从列表中找到所有匹配的数字。 但是它只返回第一个数字,并且没有遍历整个列表,有人可以帮忙吗?提前致谢

  mylist = []

def intersection(lst1, lst2):
  for n in lst1:
    for o in lst2:
      if n == o:
        mylist.append(n)
        return mylist

【问题讨论】:

  • 你的return应该在函数的end
  • 我建议改用集合,作为question中接受的回复

标签: python python-3.x list


【解决方案1】:

return 语句需要取消缩进,以便将其放置在函数的末尾而不是循环内:

def intersection(lst1, lst2):
  mylist = []
  for n in lst1:
    for o in lst2:
      if n == o:
        mylist.append(n)
  return mylist

之前,当它紧跟在mylist.append(n) 之后时,该函数会在该代码行之后立即返回结果,一旦找到第一个重叠元素就会触发该结果(即我们的答案将只有一个元素)。如果我们把它放在函数的末尾,它只会在算法完成后返回。

我还在函数内部移动了mylist 的定义,否则如果您多次调用该函数,将会覆盖结果。

另外,由于您正在学习 python,我也可能会查看list comprehensions,它被认为更“pythonic”,更简洁,并且在许多情况下执行速度更快:

def intersection(lst1, lst2):
  return [n for n in lst1 for o in lst2 if n == o]

然而,由于重叠元素在任一列表中多次出现,上述两种实现都会出现重复。例如:

intersection([1,1,2,3], [1,1,2,4])
>>> [1,1,1,1,2]

更好的实现是使用python sets and the built in set intersection operator:

def intersection(lst1, lst2):
  return list(set(lst1) & set(lst2))

intersection([1,1,2,3], [1,1,2,4])
>>> [1,2]

【讨论】:

    【解决方案2】:

    这里,return将在代码第一次进入if语句时直接执行。

    1- 只需 unndent 您的 return myList,以便它在您的循环之后执行,而不是期间执行。

    2 - 另外,你有一个在函数中返回的全局变量有点奇怪。我建议保持整洁,并返回一个新的列表,这样可以防止一些潜在的错误。

    
    def intersection(lst1, lst2):
      mylist = []
      for n in lst1:
        for o in lst2:
          if n == o:
            mylist.append(n)
      return mylist
    

    【讨论】:

      【解决方案3】:

      查看返回语句,即代码的最后一行。一旦找到匹配项,您就会从内部“for”循环返回;所以你的代码将返回并且永远不会返回到'def intersection(lst1,lst2)'函数。尝试解决这个问题,看看你是否能找到错误。

      【讨论】:

        【解决方案4】:

        一旦您在函数中返回某些内容,就无法返回上一次调用来检索更多值。取消缩进return 声明:

        mylist = []
        
        def intersection(lst1, lst2):
          for n in lst1:
            for o in lst2:
              if n == o:
                mylist.append(n)
          return mylist
        

        您也可以使用yield 语句:

        def intersection(lst1, lst2):
          for n in lst1:
            for o in lst2:
              if n == o:
                yield n
        
        print(list(intersection([1, 2, 3], [2, 3, 4])))
        

        输出:

        [2, 3]
        

        【讨论】:

          【解决方案5】:

          您只需取消缩进 return 语句,这样两个循环就可以在它返回之前完成。

          def intersection(lst1, lst2):
              my_list = []
              for n in lst1:
                  for o in lst2:
                      if n == o:
                      my_list.append(n)
              return my_list
          

          【讨论】:

            【解决方案6】:

            因为你的回归!

            def intersection():
                lst1=["1","7","5"]
                lst2 = ["8","7"]
                mylist=[]
                
                for n in lst1:
                    for o in lst2:
                        if n == o:
                            mylist.append(n)
                 print(mylist)
            
            intersection()
            

            【讨论】:

            • 这是一个完全不同(而且用处不大)的函数。它没有任何参数,也没有返回任何内容。最好通过更正缩进(取消缩进return)来解决此问题,而不是更改程序的工作方式..
            • 完全一样,哈哈!我只是声明列表并打印而不是返回......但它仍然是相同的功能,是的,这是一个缩进问题
            • 它不是 same 功能。原始函数接受输入并(尝试)返回输出。这个函数没那么有用 - 每次调用它都会做同样的事情。
            猜你喜欢
            • 2016-03-12
            • 2020-11-17
            • 2023-02-22
            • 2020-12-01
            • 2022-01-10
            • 1970-01-01
            • 1970-01-01
            • 2019-11-13
            • 2019-11-03
            相关资源
            最近更新 更多