【问题标题】:Python difference between filter() and map()filter() 和 map() 之间的 Python 区别
【发布时间】:2021-12-22 01:05:43
【问题描述】:

作为 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]

这表明过滤器评估函数,如果为真,则返回传递的元素。 这里是函数

def f(x): return x * 2

评估为

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

相比之下,map 计算函数表达式并将结果作为项返回。 所以 filter 总是期望它的函数做比较类型的任务来过滤掉元素,而 map 期望它的函数评估一个语句以获得一些结果。

这种理解正确吗?

【问题讨论】:

标签: python


【解决方案1】:

它们的工作方式略有不同,但您的想法是正确的。

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

【讨论】:

  • 我通过过滤器中的平方函数来查看我得到了什么,我得到了列表(nums)的所有值。这意味着过滤函数基本上用于“条件检查”,当我通过 map() 中的 is_even 函数时,我得到列表中每个数字的布尔值(比如,第一项是 1,这是奇数,所以我得到错误,并且很快,)。所以,我认为 map() 基本上是用于对列表项的操作。我说的对吗?
【解决方案2】:

在map中:函数将应用于iterable的所有对象。 在过滤器中:函数将仅应用于那些在表达式中指定的条件为 True 的可迭代对象。

【讨论】:

    【解决方案3】:

    根据我的理解,下面是地图和过滤器之间的区别:

    def even(num):
        if(num % 2 == 0):
            return 'Even'
    

    num_list = [1,2,3,4,5]

    print(list(filter(even,num_list))) ->>>>>>>输出:[2, 4]

    print(list(map(even,num_list))) ->>>>>>> 输出:[None, 'Even', None, 'Even', None]

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

    【讨论】:

      【解决方案4】:

      我想是的,你已经很清楚了。 Mapfilter 都是将函数应用于可迭代对象的方法。 在 Map 中,您可以使用多个迭代器

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

      而 在 filter 中只能使用一个 iterable

      definition : filter(function_object, iterable)
      

      在过滤器中,function_object 必须仅返回布尔值。 例如下面是具有多个可迭代作为输入的 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]
      

      【讨论】:

        【解决方案5】:

        你的例子太准确了。 在过滤器函数中,您应该传递一个函数和一个列表(该函数必须评估为真或假)。如果在函数中传递的元素返回 true,则过滤器函数会将传递的元素放入新列表中。 map 函数将一个元素传递给一个函数并返回函数的输出并将其存储到新列表中。

        【讨论】:

          【解决方案6】:

          ma​​p(): 函数将应用于所有可迭代对象,我们可以根据需要使用尽可能多的 literables
          filter(): 函数将是仅适用于那些可迭代的对象并添加到结果中哪个项目为真,我们只能使用一个 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))
          

          【讨论】:

            【解决方案7】:

            filter() 和 map() 函数有点不同。 Maps 采用普通函数,而 Filter 采用布尔函数。事实上,过滤器是带有条件逻辑的映射,是布尔逻辑。

            【讨论】:

              【解决方案8】:

              map() 将任何适用的逻辑应用于列表类型的任意数量的参数,并返回一个包含映射到参数列表的每个相应成员的值的可迭代对象。

              示例:

              m = map(lambda x,y: 10+x+y, [1,2,3,4],[10,20,30,40])
              
              print(list(m))
              

              输出: [21、32、43、54]

              filter() 将指定的条件应用于列表类型的一个参数,并返回一个包含满足指定条件并因此从参数中选择的值的可迭代对象。

              示例:

              f = filter(lambda x: x<3, [1,2,3,4])
              
              print(list(f))
              

              输出: [1, 2]

              【讨论】:

                【解决方案9】:

                映射和过滤器的主要区别在于返回值。地图将始终具有列表中元素的表示形式。过滤器会过滤掉唯一满足函数中条件的元素。

                def checkElementIn(a):
                
                    nameList = ['b','a','l','l']
                
                    if a in nameList:
                        return a 
                
                testList = ['r','e','d','b','a','l','l']
                
                m_list = map(checkElementIn,testList)
                
                for i in m_list:
                    print(i)
                




                b
                一个
                l
                l

                f_list = filter(checkElementIn,testList)
                
                for i in f_list:
                    print(i)
                


                一个
                l
                l

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2011-11-25
                  • 2016-03-29
                  • 2016-01-14
                  • 2019-03-29
                  • 2011-03-14
                  • 2016-05-30
                  相关资源
                  最近更新 更多