大家好,我是米洛,

今日技巧之黑暗四天王: filter

好久不见,我是非常好用的小技巧君。小技巧也许会迟到,但不会缺席

今天我们用最快的方式来秒学map-reduce里面的filter。

map-reduce含义

每天一个Python小技巧(9)_生成器这是维基百科针对map reduce的定义

按照我对他的理解,map-reduce为用户提供了快速处理批量数据的方法,如何叫快速呢?让我们来各个击破。

钢铁海龙兽Filter

难度: ⭐⭐⭐

首先登场的是filter,filter的英文意思是过滤的意思,那他有什么用呢?

使用场景

假设你有一个整数数组,但里面有很多数字,比如:

[1, 2, 1,-1,-22,12,124,12,-112]

这个时候,你需要取出里面大于0的数字,并还得保持原来的顺序。

  • 三流青年告诉你for的用法
data = [1, 2, 1,-1,-22,12,124,12,-112]
result = []
for n in data:
    if n > 0:
        result.append(n)
  • 二流青年告诉你列表推导式的用法
data = [1, 2, 1,-1,-22,12,124,12,-112]
result = [x for x in data if x > 0]

技巧君告诉你filter的用法。

filter

filterPython内置的方法,就和print/def等属于一类。

它接受2个参数:

  • function

    这里的function指的就是具体定义的函数,那他有什么用呢?待会说。

  • iterable

    iterable指的是一个可迭代对象,注意这里他不单单指list哈!

    那么什么是可迭代呢?简单的说,就是我可以去遍历它!那么什么是遍历呢?就是你可以从它的起点,一直访问到它的终点。例如我们的list就是如此,我们可以用

for ... in XXX:

简便理解: 如果这个xxx支持for操作,那么它就是可迭代的。

比如我们的文件对象数组字典的keys/values生成器等等。

知道参数以后,我们再来讲讲filter是什么用处。

看好了,我只说一遍!不过你可以回看几遍(非常赖皮):

filter的重用是,用第一个参数(function)去筛选出第二个参数(iterable)里面的数据。这个function一般会返回一个bool值,如果bool是true元素则会保留,否则iterable里面的元素就要被丢弃。以此来达到筛选的目的。

也就是说,回到我们刚才的场景,我们只需要编写一个方法,判断数值是否大于0,大于0返回True,否则返回False。这样就可以达到我们的要求了!

  • 编写函数
def larger_than_zero(number):
    return number > 0
  • 使用filter
def larger_than_zero(number):
    return number > 0
data = [1, 2, 1,-1,-22,12,124,12,-112]
result = filter(larger_than_zero, data)

那这样是不是就可以了呢?我们试试看print出来result:

每天一个Python小技巧(9)_迭代_02可以看到并不是的

它返回了一个filter object,它也是iterable的,我们试试迭代它:

每天一个Python小技巧(9)_数组_03可以看到它确实可迭代,也去掉了小于0的数据

可能这时候会有同学想暴击技巧君了,我给你个list,你给我filter以后也要还给我list啊!不然我怎么玩????

别急,其实filter object是可以转换为list的。只需要进行一次类型转换即可:

每天一个Python小技巧(9)_生成器_04可以发现result里面空了

技巧君翻车了吗?其实不然,filter对象是生成器的一种,数据读取一次以后如果不存储下来,就等于被消耗了。这也是他们性能好的原因之一。

我们回到之前,重新生成一次filter对象:

每天一个Python小技巧(9)_数组_05直接使用list会拿到完整数据

这时候又有同学要diss技巧君了,你这个一点都不优雅,代码行数爆炸!远远不如列表推导式简单,哼!

其实我们定义函数还有一种方法:lambda,它是配合map/reduce/filter的利器!

data = [1, 2, 1,-1,-22,12,124,12,-112]
result = list(filter(lambda x: x>0, data))
每天一个Python小技巧(9)_迭代_06可以看到,也是一行搞定

课后结语

本文比较基础,难度三颗星。技巧君讲的稍微细致了一些,希望大家多敲打键盘,练习练习~