我正在自学编程。在我的代码中,我正在练习嵌套循环,并且我正在做一个练习以查看是否可以从列表中找到所有匹配的数字。 但是它只返回第一个数字,并没有遍历整个列表,有人可以帮忙吗?提前致谢
mylist = []
def intersection(lst1, lst2):
for n in lst1:
for o in lst2:
if n == o:
mylist.append(n)
return mylist
答案 0 :(得分:6)
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]
答案 1 :(得分:5)
一旦你在一个函数中返回了一些东西,就不会回到之前的调用来检索更多的值。取消缩进 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]
答案 2 :(得分:3)
这里,return
会在代码第一次进入 if
语句时直接执行。
1- 只需取消缩进你的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 :(得分:3)
看看 return 语句,你的代码的最后一行。一旦找到匹配项,您就会从内部“for”循环返回;所以你的代码将返回并且永远不会回到'defintersection(lst1, lst2)'函数。试着解决这个问题,看看你是否能找到错误。
答案 4 :(得分:3)
您只需要取消 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
答案 5 :(得分:3)
因为你回来了!
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()