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

时间:2017-11-30 16:40:09

标签: 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)

我们看到过滤器和地图都会传递一个列表并将其输出分配给新列表。

此脚本的输出是

[1, 2, 3, 4]
[2, 4]
[1, 2, 3, 4]
[2, 4, 6, 8]

问题是过滤器和地图的函数调用看起来都是一样的,所以如果我们交换传递给它们的函数的内容,它们将如何表现。

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)

这导致

[1, 2, 3, 4]
[1, 2, 3, 4]
[1, 2, 3, 4]
[False, True, False, True]

这表示过滤器评估函数,如果为true,则返回传递的元素。 这里的功能

def f(x): return x * 2

评估为

def f(x): return x * 2 != 0

相反,map会计算函数表达式并将结果作为项返回。 所以filter总是希望它的函数做比较类型的任务来过滤掉元素,而map期望它的函数来评估一个语句以获得一些结果。

这种理解是否正确?

7 个答案:

答案 0 :(得分:3)

他们的工作方式略有不同,但你有正确的想法。

Map获取列表中的所有对象,并允许您向其应用函数 Filter获取列表中的所有对象,并通过函数运行该对象,以创建一个新列表,其中包含在该函数中返回True的所有对象。

这是一个例子

1 2 3 4 5
1 4 9 16 25

这是

的输出
def is_even(num):
    return num % 2 == 0


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

print(*nums)
print(*filtered)

以下是过滤器

的示例
2 4 6 7 8
2 4 6 8

这个的输出是

<span>

答案 1 :(得分:0)

我想是的,你的照片很多。 地图过滤器都是将函数应用于可迭代对象的方法。 在地图中,您可以使用多个可迭代项 定义:map(function_object,iterable1,iterable2,...)

而 在过滤器中,只能使用一个可迭代的对象 定义:过滤器(function_object,可迭代)

在过滤器中,function_object必须仅返回布尔值。 为了示例,下面是具有多个可迭代项作为输入的Map

list_a = [1、2、3] list_b = [10,20,30]

map(lambda x,y:x + y,list_a,list_b)#输出:[11,22,33]

答案 2 :(得分:0)

在map中:函数将应用于所有iterable对象。 在filter中:函数仅适用于在表达式中指定的条件下变为True的可迭代对象。

答案 3 :(得分:0)

您的示例过于准确。 在过滤器函数中,您应该传递一个函数和一个列表(该函数必须评估为true或false)。如果传递给函数的元素返回true,则过滤器函数会将传递的元素放入新列表中。其中,map函数将元素带入一个函数,然后返回该函数的输出,并将其存储到新列表中。

答案 4 :(得分:0)

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

def even(num):
    if(num % 2 == 0):
        return 'Even'

num_list = [1,2,3,4,5]

print(list(filter(even,num_list))) ->>>>>>输出:[2, 4]

print(list(map(even,num_list))) ->>>>>>> 输出:[None, 'Even', None, 'Even', None]

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

答案 5 :(得分:0)

ma​​p(): 函数将应用于所有可迭代对象,我们可以根据需要使用任意数量的可迭代对象
filter(): 函数将只应用于那些 iterable 的对象并添加到结果中,哪个 item 为 True,我们只能使用一个 literable

下面的代码0没有加到filter函数中,因为0在某些情况下是False的表示,所以没有加到filter中,而是加到map函数结果中

def check(num):
    return num*1


nums = [0,2, 4, 6, 7, 8]
result = filter(check, nums)

print(list(result))

def check(num):
    return num*1


nums = [0,2, 4, 6, 7, 8]
result = map(check, nums)

print(list(result))

答案 6 :(得分:0)

filter() 和 map() 函数有点不同。 Maps 采用普通函数,而 Filter 采用布尔函数。事实上,过滤器是带有条件逻辑的映射,布尔逻辑。