我试图在列表中找到所有匹配的答案,但它不起作用

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

  mylist = []

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

回答

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 集合和内置的集合交集运算符:

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

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


回答

一旦你在函数中返回了一些东西,就不会回到之前的调用来检索更多的值。取消缩进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]


以上是我试图在列表中找到所有匹配的答案,但它不起作用的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>