Python中的过滤器功能-解决方案之间的差异

时间:2019-07-16 14:02:56

标签: python filter

目标是确定以下两个列表之间的相互关系:

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)

它不是像我一直尝试的那样执行吗?它们之间有什么区别?

3 个答案:

答案 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)