Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
filter()和map()之间的Python差异_Python - Fatal编程技术网

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

filter()和map()之间的Python差异,python,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) 我们看到,我们向过滤器和映射传递一个列表,并将它们的输出

作为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]
这显示过滤器对函数求值,如果为true,则返回传递的元素。 这里是函数

def f(x): return x * 2
评估为

def f(x): return x * 2 != 0
相反,map计算函数表达式并将结果作为项返回。 所以filter总是希望它的函数执行比较类型的任务来过滤掉元素,而map则希望它的函数对语句求值以得到一些结果


这种理解正确吗?

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

映射获取列表中的所有对象,并允许您对其应用函数 过滤器获取列表中的所有对象,并通过一个函数运行该函数,以创建一个新列表,其中包含该函数中返回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

我想是的,你基本上了解情况。 Mapfilter都是将函数应用于可重用项的方法。 在映射中可以使用多个ITerable

definition : map(function_object, iterable1, iterable2,...)
鉴于 在过滤器中只能使用一个iterable

definition : filter(function_object, iterable)
在过滤器中,函数_对象必须仅返回布尔值。 为了便于示例,下面是以多个iterables作为输入的映射

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

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

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

您的示例太精确了。
在filter函数中,您应该传递一个函数和一个列表(该函数的计算结果必须为true或false)。如果在函数中传递的元素返回true,则filter函数将把传递的元素放入一个新列表中。其中,as map函数将获取一个元素并将其传递给函数,然后返回函数的输出并将其存储到新列表中。

根据我的理解,以下是map和filter之间的区别:

def even(num):
    if(num % 2 == 0):
        return 'Even'
num_list=[1,2,3,4,5]

打印(列表(筛选器(偶数,num_列表))->>>>>>输出:[2,4]

打印(列表(映射(偶数,num_列表))->>>>>>>>输出:[无,'偶数',无,'偶数',无]

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

map():函数将应用于iterable的所有对象,我们可以根据需要使用任意多的Literable
filter():函数将仅应用于iterable的那些对象,并添加到结果中。如果该项为True,则我们只能使用一个literable

在下面的示例中,代码0不会添加到筛选函数中,因为在某些情况下,0是False的表示形式,因此不会添加到筛选中,也不会添加到映射函数结果中

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

通过阅读随附的文档字符串,可以加深对理解的可能重复。在python控制台中键入
filter?
map?
,并以简洁的形式阅读它们应该做什么。我在filter中使用了平方函数来查看我得到了什么,我得到了list(nums)的所有值。这意味着filter函数基本上用于“条件检查”,当map()中的i pas是_偶数函数时,我会为列表中的每个数字获取布尔值(比如,第一项是1,这是奇数,所以我得到false,等等)。所以,我认为map()基本上用于对列表项的操作。我说得对吗?