目标是确定以下两个列表之间的相互关系:
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)
它不是像我一直尝试的那样执行吗?它们之间有什么区别?
答案 0 :(得分:2)
在这种情况下,使用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
方法消除它。
答案 1 :(得分:2)
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]
答案 2 :(得分:0)
不,您的第一个解决方案与第二个解决方案不同。
您正在遍历列表,并且对于每个元素,您都在创建一个新列表。 结果只是最后一个元素的列表。 您可以通过创建其他列表来解决此问题:
temp = []
for i in a:
filt1=list(filter(lambda x:x==i,b))
temp.extend(filt1)
print(temp)