Python:过滤器(函数,序列)和映射(函数,序列)之间的区别

时间:2013-09-22 02:10:52

标签: python functional-programming map-function filterfunction

我正在阅读Python文档,以深入了解Python语言并遇到过滤器和地图功能。我之前使用过滤器,但从未映射过,虽然我已经在SO上看到了各种Python问题。

在Python教程中阅读了它们之后,我对两者之间的区别感到困惑。例如,来自5.1.3. Functional Programming Tools

>>> def f(x): return x % 2 != 0 and x % 3 != 0
...
>>> filter(f, range(2, 25))
[5, 7, 11, 13, 17, 19, 23]

>>> def cube(x): return x*x*x
...
>>> map(cube, range(1, 11))
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]

这些对我来说看起来几乎完全相同,所以我进入终端以交互方式运行Python并测试了我自己的情况。我对上面的第一个和第二个实例使用了map,对于第一个实例(return x % 2 != 0 and x % 3 != 0),它返回了一个布尔值而不是数字列表。

为什么map有时会返回一个布尔值,有时会返回实际的返回值?

有人可以向我解释mapfilter之间的区别吗?

6 个答案:

答案 0 :(得分:34)

list(map(cube, range(1, 11)))

相当于

[cube(1), cube(2), ..., cube(10)]

返回的列表
list(filter(f, range(2, 25)))
运行

后,

相当于result

result = []
for i in range(2, 25):
    if f(i):
        result.append(i)

请注意,使用map时,结果中的项目是函数cube返回的值。

相反,ffilter(f, ...)返回的值不是result中的项目。 f(i)仅用于确定i中<{>> 值<{1}}。


在Python2中,resultmap返回列表。在Python3中,filtermap返回迭代器。上面,filterlist(map(...))用于确保结果是一个列表。

答案 1 :(得分:23)

filter(),顾名思义,过滤原始的可迭代项,并重新提供为True提供的函数返回filter()的项目。

另一方面,

map()将提供的函数应用于iterable的每个元素,并返回每个元素的结果列表。

按照你给出的例子,让我们比较一下:

>>> def f(x): return x % 2 != 0 and x % 3 != 0
>>> range(11)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> map(f, range(11))  # the ones that returns TRUE are 1, 5 and 7
[False, True, False, False, False, True, False, True, False, False, False]
>>> filter(f, range(11))  # So, filter returns 1, 5 and 7
[1, 5, 7]

答案 2 :(得分:3)

python中的

mapfilter函数非常不同,因为它们的表现非常不同。让我们举一个快速的例子来区分它们。

地图功能

让我们定义一个函数,该函数将采用字符串参数并检查它是否以元音字母序列呈现。

def lit(word):
    return word in 'aeiou'

现在让我们为此创建一个map函数并传递一些随机字符串。

for item in map(lit,['a','b','e']):
    print(item)

是的,相当于跟随

lit('a') , lit('b') , lit('e')

只需打印

True
False
True 

过滤功能

现在让我们为此创建一个filter函数并传递一些随机字符串。

for item in filter(lit,['a','b','e']):
    print(item)

filter顾名思义,过滤原始的iterable,并重新提供为提供给过滤器函数的函数返回True的项目。

只需打印

a
e

将它here分开以供将来参考,如果您觉得这很有用。

答案 3 :(得分:1)

过滤器-返回真实值的位置


var_list = [10,20,0,1]

var_b = list(filter(lambda var_a : var_a*2,var_list))

print("Values are",var_b)

输出


值是[10、20、1]

地图-返回实际结果


var_list = [10,20,0,1]

var_b = list(map(lambda var_a : var_a*2,var_list))

print("Values are",var_b)

输出


值是[20、40、0、2]

减少-取列表中的前2个项目,然后调用功能, 在下一个函数调用中,上一个调用的结果将是第一个参数,列表中的第三项将是第二个参数


from functools import *

var_list = [10,20,0,1]

var_b = list(map(lambda var_a : var_a*2,var_list))

print("Values of var_b ",var_b)

var_c = reduce(lambda a,b:a*2,var_b)

print("Values of var_c",var_c)

输出


var_b [20,40,0,2]的值

var_c 160的值

答案 4 :(得分:0)

过滤器(函数,可迭代)函数(指针,类似于C语言)返回布尔类型

map(function,iterable)函数(指针,如C语言)返回例如诠释

def filterFunc(x):
    if x & 1 == 0:
        return False
    return True


def squareFunc(x):
    return x ** 2


def main():
    nums = [5, 2, 9, 4, 34, 23, 66]
    odds = list(filter(filterFunc, nums))   # filter(function, iterable)
    print(odds)

    square = list(map(squareFunc, nums))    # map(function, iterable)
    print(square)


if __name__ == '__main__':
    main()

答案 5 :(得分:0)

Filter函数用于过滤原始列表中的结果,而Map函数用于将某些函数应用于原始列表中,因此会生成一个新列表。 请参阅以下示例,其中过滤器功能仅在它们为奇数时才用于返回列表中的项目。下面使用Map函数返回列表中各项的平方。

Lambda函数: 使用Lambda:Lambda定义不包含“ return”语句,它始终包含要返回的表达式。我们还可以将lambda定义放在需要函数的任何位置,而不必完全将其分配给变量。这就是lambda函数的简单性。

g = lambda x: x*x*x 
print(g(5)) 
#125

Python中的filter()函数接受一个函数和一个列表作为参数。这提供了一种优雅的方法来过滤出序列“序列”的所有元素,为此函数返回True。这是一个小程序,可从输入列表中返回奇数:

li = [4,5,7,8,9] 
final_list = list(filter(lambda x: (x%2 != 0) , li)) 
print(final_list)
#[5,7,9]

Python中的map()函数接受一个函数和一个列表作为参数。通过将函数应用于列表的每个项目,将返回一个新列表。

li = [5, 7, 4, 9] 
final_list = list(map(lambda x: x*x , li)) 
print(final_list)
#[25, 49, 16, 81]