Python 中的过滤器函数 - 解决方案之间的差异



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

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)

相关内容

最新更新