filter()和map()之间的Python差异

2024-09-30 08:26:53 发布

您现在位置: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]

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

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]

这显示filter对函数求值,如果为true,则返回传递的元素。 这里是函数

def f(x): return x * 2

评估为

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

相反,map计算函数表达式并将结果作为项返回。 所以filter总是希望它的函数执行比较类型的任务来过滤掉元素,而map则希望它的函数对语句求值以获得某些结果。

这种理解正确吗?


Tags: 函数脚本falsetrue元素map列表return
3条回答

我想是的,你很了解这张照片。 Map和filter都是将函数应用于iterable的方法。 在映射中可以使用多个iterable

definition : map(function_object, iterable1, iterable2,...)

鉴于 在过滤器中只能使用一个iterable

definition : filter(function_object, iterable)

在filter中,函数对象只返回布尔值。 为了示例起见,下面是以多个iterable作为输入的Map

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

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

在map中:函数将应用于iterable的所有对象。 In filter:函数将仅应用于iterable的对象,这些对象在表达式中指定的条件下变为True。

它们的工作方式都有点不同,但你的想法是对的。

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

这里有一个例子

def square(num):
    return num * num

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

print(*nums)
print(*mapped)

结果是

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

相关问题 更多 >

    热门问题