目标是确定以下两个列表之间的相互元素:
a = [1,2,3,5,7,9]
b = [2,3,5,6,7,8]
我尝试了以下方法:
a = [1,2,3,5,7,9]
b = [2,3,5,6,7,8]
for i in a:
filt1=list(filter(lambda x:x==i,b))
print(filt1)
预期结果是:
[2, 3, 5, 7]
以下代码有效:
a = [1,2,3,5,7,9]
b = [2,3,5,6,7,8]
filt2=(list(filter(lambda x: x in a,b)))
print(filt2)
它的表现不像我一直在尝试的那个吗?它们之间有什么区别?
filt1
在for 循环的每次迭代中都被覆盖。
你最终会得到[]
,因为最后一个数字 (9( 不在 b
中。
事先定义它,并向其中添加筛选器列表。
试试这个:
a = [1, 2, 3, 5, 7, 9]
b = [2, 3, 5, 6, 7, 8]
filt1 = []
for i in a:
filt1 += list(filter(lambda x: x == i, b))
print(filt1)
输出:
[2, 3, 5, 7]
在这种情况下,使用 filter
将不是一个有效的解决方案,set
的交集是一种合理的方法:
a = [1,2,3,5,7,9]
b = [2,3,5,6,7,8]
common_nums = list(set(a) & set(b))
print(common_nums) # [2, 3, 5, 7]
至于问题:在第一种方法中,您将在每次迭代中重新分配filt1
,因此不会获得预期的结果(不会累积常见项目(。
for i in a:
filt1=list(filter(lambda x:x==i,b)) # <---
但我不建议修复它,而是消除它以支持set
方法。
不,您的第一个解决方案与第二个解决方案不同。
您正在循环访问一个列表,并且对于每个列表,您正在创建一个新列表。结果只是最后一个元素的列表。您可以通过创建其他列表来修复它:
temp = []
for i in a:
filt1=list(filter(lambda x:x==i,b))
temp.extend(filt1)
print(temp)