34

我正在阅读 Python 文档以真正深入了解 Python 语言,并遇到了 filter 和 map 函数。我以前使用过过滤器,但从未使用过映射,尽管我在 SO 上的各种 Python 问题中都见过这两种情况。

在 Python 教程中阅读了它们之后,我对两者之间的区别感到困惑。例如,从5.1.3 开始。函数式编程工具

>>> 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有时返回布尔值而有时返回实际返回值?

map有人可以向我准确解释和之间的区别filter吗?

4

5 回答 5

38
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

相反, in 返回的值不是finfilter(f, ...)中的项目resultf(i)仅用于确定i是否应保存在result.


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

于 2013-09-22T02:13:42.590 回答
26

filter(),顾名思义,过滤原始可迭代对象并保留True为提供给 的函数返回的项filter()

map()另一方面,将提供的函数应用于可迭代的每个元素并返回每个元素的结果列表。

按照您给出的示例,让我们比较它们:

>>> 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]
于 2013-09-22T02:17:53.077 回答
4

mappython 中的函数和filter函数非常不同,因为它们的执行方式非常不同。让我们举一个简单的例子来区分它们。

地图功能

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

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

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

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顾名思义,过滤原始迭代并保留为提供给过滤器函数的函数返回 True 的项。

简单地它会打印

a
e

如果您觉得这很有用,请在此处分叉以供将来参考。

于 2018-04-27T11:24:12.557 回答
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]

Map -- 返回实际结果


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 的值

于 2018-11-06T12:43:27.123 回答
0

filter(function, iterable) 函数(指针,就像在 C 中一样)返回布尔类型

map(function, iterable) function (pointer, like in C) return eg int

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()
于 2018-11-03T12:07:47.557 回答