filter()和map()之间的Python区别

RKu*_*Kum 2 python

作为python的新手,我只是想弄清楚filter()和map()之间的区别。我编写了一个示例脚本,如下所示:

def f(x): return x % 2 == 0
def m(y): return y * 2

list = [1,2,3,4]

flist = filter(f, list)
print(list)
print(flist)

mlist = map(m, list)
print(list)
print(mlist)
Run Code Online (Sandbox Code Playgroud)

我们看到,对于过滤器和映射,我们都传递了一个列表,并将其输出分配给新列表。

该脚本的输出是

[1, 2, 3, 4]
[2, 4]
[1, 2, 3, 4]
[2, 4, 6, 8]
Run Code Online (Sandbox Code Playgroud)

问题是过滤器和映射的函数调用看起来相同,因此如果我们交换传递给它们的函数的内容,它们的行为将如何。

def f(x): return x * 2
def m(y): return y % 2 == 0

list = [1,2,3,4]

flist = filter(f, list)
print(list)
print(flist)

mlist = map(m, list)
print(list)
print(mlist)
Run Code Online (Sandbox Code Playgroud)

这导致

[1, 2, 3, 4]
[1, 2, 3, 4]
[1, 2, 3, 4]
[False, True, False, True]
Run Code Online (Sandbox Code Playgroud)

这说明filter对函数进行求值,如果为true,它将返回传递的元素。这里的功能

def f(x): return x * 2
Run Code Online (Sandbox Code Playgroud)

评估为

def f(x): return x * 2 != 0
Run Code Online (Sandbox Code Playgroud)

相反,map评估函数表达式并将结果作为项目返回。因此,filter始终希望其功能执行比较任务类型以过滤出元素,而map希望其功能对语句进行评估以获得一些结果。

这种理解正确吗?

小智 7

在map中:函数将应用于所有可迭代对象。在过滤器中:函数将仅应用于那些在表达式中指定的条件下为 True 的可迭代对象。


Zac*_* B. 6

它们的工作原理有些不同,但是您有正确的想法。

Map接受列表中的所有对象,并允许您对其应用过滤器Filter接受列表中的所有对象,然后通过函数运行该对象,以创建一个新列表,其中所有对象均在该函数中返回True。

这是一个例子

def square(num):
    return num * num

nums = [1, 2, 3, 4, 5]
mapped = map(square, nums)

print(*nums)
print(*mapped)
Run Code Online (Sandbox Code Playgroud)

这个的输出是

1 2 3 4 5
1 4 9 16 25
Run Code Online (Sandbox Code Playgroud)

这是过滤器的一个例子

def is_even(num):
    return num % 2 == 0


nums = [2, 4, 6, 7, 8]
filtered = filter(is_even, nums)

print(*nums)
print(*filtered)
Run Code Online (Sandbox Code Playgroud)

这样的输出是

2 4 6 7 8
2 4 6 8
Run Code Online (Sandbox Code Playgroud)


小智 6

根据我的理解,以下是地图和过滤器之间的区别:

def even(num):
    if(num % 2 == 0):
        return 'Even'
Run Code Online (Sandbox Code Playgroud)

数字列表 = [1,2,3,4,5]

打印(列表(过滤器(偶数,num_list)))->>>>>>>输出:[2, 4]

print(list(map(even,num_list))) ->>>>>>> 输出:[无,'偶数',无,'偶数',无]

因此,我们可以这样说: filter():格式化包含满足特定条件的元素的新列表。map():函数迭代给定可迭代中的所有项目,并执行我们作为参数传递的函数。