【问题标题】:Python: Difference between filter(function, sequence) and map(function, sequence)Python:过滤器(函数,序列)和映射(函数,序列)之间的区别
【发布时间】:2013-09-27 04:32:27
【问题描述】:

我正在阅读 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 之间的区别吗?

【问题讨论】:

    标签: python functional-programming map-function filterfunction


    【解决方案1】:
    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 应保留在result 中。


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

    【讨论】:

    • list(map(cube, range(1, 11))) 等价于 [cube(1), cube(2), ..., cube(10)]。
    【解决方案2】:

    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]
    

    【讨论】:

    • 现在说得通了,我看到过滤器术语如何表明函数与映射的作用。
    • 其实map()这个名字也是有道理的,在某些领域,map作为动词时,意思是找到1对1的对应关系。例如在数学中:“将 x 映射到 y”或在遗传学中:“将糖尿病映射到基因”。 Python 的优点之一就是:这些名称通常是有意义的。
    • 这是一个很好的观点。有趣的是,编程的某些方面与日常示例有多么相似。就像我在代数 2 中一样,我们正在学习函数 f(x),一半的班级被难倒了,但这个想法与编程中的函数 100% 相似。
    【解决方案3】:

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

    地图功能

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

    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
    

    如果你觉得这很有用,请把它here 留作将来参考。

    【讨论】:

      【解决方案4】:

      filter(function, iterable) function (pointer, like in C) return boolean type

      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】:

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


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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-09-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-27
          • 2022-08-23
          • 1970-01-01
          相关资源
          最近更新 更多