python-内置函数-filter-map-reduce-zip

python内置函数filter、map、reduce、zip使用详解

filter

  • 功能
    filter的功能是过滤掉序列中不符合函数条件的元素,当序列中要删减的元素可以用某些函数描述时,就应该想起filter函数。
  • 调用
    filter(function,sequence),function可以是匿名函数或者自定义函数,它会对后面的sequence序列的每个元素判定是否符合函数条件,返回TRUE或者FALSE,从而只留下TRUE的元素;sequence可以是列表、元组或者字符串
  • 例子
    1
    2
    3
    4
    x = [1,2,3,4,5]
    list(filter(lambda x: x%2 == 0, x)) # 找出偶数。python3.*之后filter函数返回的不再是列表而是迭代器,所以需要用list转换。
    # 输出:
    [2, 4]

map

  • 功能
    求一个序列或者多个序列进行函数操作之后的值,就该想到map这个函数,它是python自带的函数,在python3.*之后返回的是迭代器,同filter,需要进行列表转换
  • 调用
    map(function,iterable1,iterable2),function中的参数值不一定是一个x,也可以是x和y,甚至多个;后面的iterable表示需要参与function运算中的参数值,有几个参数值就传入几个iterable
  • 例子
    1
    2
    3
    4
    5
    x = [1, 2, 3, 4, 5]
    y = [2, 3, 4, 5, 6]
    list(map(lambda x, y: (x * y) + 2, x, y))
    # 输出:
    [4, 8, 14, 22, 32]

reduce

  • 功能
    对一个序列进行压缩运算,得到一个值。但是reduce在python2的时候是内置函数,到了python3移到了functools模块,所以使用之前需要 from functools import reduce
  • 调用
    reduce(function,iterable),其中function必须传入两个参数,iterable可以是列表或者元组
  • 例子
    1
    2
    3
    4
    from functools import reduce
    y = [2, 3, 4, 5, 6]
    reduce(lambda x, y: x + y, y) # 直接返回一个值
    # 输出 20

其计算原理:
先计算头两个元素:f(2, 3),结果为5;
再把结果和第3个元素计算:f(5, 4),结果为9;
再把结果和第4个元素计算:f(9, 5),结果为14;
再把结果和第5个元素计算:f(14, 6),结果为20;
由于没有更多的元素了,计算结束,返回结果20

zip

  • 功能
    从参数中的多个迭代器取元素组合成一个新的迭代器, 返回一个zip对象,其内部元素为元组;可以转化为列表或元组或字典(2个iterable的时候);
  • 调用
    zip(*iterable), 传入元组、列表、字典等迭代器
  • 例子
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # 只有一个参数
    list1 = [1, 2, 3]
    print(list(zip(list1))) # 输出 [(1,), (2,), (3,), 内部元素为元组
    # 两个参数
    list2 = ['a', 'b', 'c']
    print(list(zip(list1, list2))) # 输出 [(1, 'a'), (2, 'b'), (3, 'c')]
    print(dict(zip(list1, list2)))) # 输出 {1: 'a', 2: 'b', 3: 'c'}, 快捷生成字典的方式
    # 三个参数
    list3 = ['A', 'B', 'C']
    print(list(zip(list1, list2, list3))) # 输出 [(1, 'a', 'A'), (2, 'b', 'B'), (3, 'c', 'C')]
    # 参数长度不一样
    list4 = ['m', 'n']
    print(list(zip(list1, list4))) # 输出 [(1, 'm'), (2, 'n')] , 这里list1的3没有输出。当两个参数的列表长度不一样时,取两者结构中最小的行数和列数,依照最小的行数和列数将对应位置的元素进行组合

*zip

  • 功能
    是zip()函数的逆过程,将zip对象变成原先组合前的数据
  • 调用
    zip(iterable)
  • 例子
    1
    2
    3
    4
    list1 = [1, 2, 3]
    list2 = ['a', 'b', 'c']
    print(*zip(list1, list2)) # 输出 (1, 'a') (2, 'b') (3, 'c')
    m, n = zip(*zip(list1, list2)) # m 为 (1, 2, 3), n 为 ('a', 'b', 'c')