• 【转】Python 中map、reduce、filter函数


    转自:http://www.blogjava.net/vagasnail/articles/301140.html?opt=admin

    介绍下Python 中 map,reduce,和filter 内置函数的方法:

    一:map

    map(...)
        map(function, sequence[, sequence, ...]) -> list

    说明:

          对sequence中的item依次执行function(item),执行结果输出为list。

    例子:

    复制代码
    复制代码
    >>> map(str, range(5))           #对range(5)各项进行str操作
    ['0', '1', '2', '3', '4']        #返回列表
    >>> def add(n):return n+n
    ... 
    >>> map(add, range(5))           #对range(5)各项进行add操作
    [0, 2, 4, 6, 8]
    >>> map(lambda x:x+x,range(5))   #lambda 函数,各项+本身
    [0, 2, 4, 6, 8]
    >>> map(lambda x:x+1,range(10)) #lambda 函数,各项+1
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    >>> map(add,'zhoujy') ['zz', 'hh', 'oo', 'uu', 'jj', 'yy'] #想要输入多个序列,需要支持多个参数的函数,注意的是各序列的长度必须一样,否则报错: >>> def add(x,y):return x+y ... >>> map(add,'zhoujy','Python') ['zP', 'hy', 'ot', 'uh', 'jo', 'yn'] >>> def add(x,y,z):return x+y+z ... >>> map(add,'zhoujy','Python','test') #'test'的长度比其他2个小 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: add() takes exactly 2 arguments (3 given) >>> map(add,'zhoujy','Python','testop') ['zPt', 'hye', 'ots', 'uht', 'joo', 'ynp']
    复制代码
    复制代码

    二:reduce

    reduce(...)
        reduce(function, sequence[, initial]) -> value

    说明:

          对sequence中的item顺序迭代调用function,函数必须要有2个参数。要是有第3个参数,则表示初始值,可以继续调用初始值,返回一个值。

    例子:

    复制代码
    复制代码
    >>> def add(x,y):return x+y
    ... 
    >>> reduce(add,range(10))        #1+2+3+...+9
    45
    >>> reduce(add,range(11))        #1+2+3+...+10
    55
    >>> reduce(lambda x,y:x*y,range(1,3),5)           #lambda 函数,5是初始值, 1*2*5
    10
    >>> reduce(lambda x,y:x*y,range(1,6))             #阶乘,1*2*3*4*5
    120
    >>> reduce(lambda x,y:x*y,range(1,6),3)           #初始值3,结果再*3
    360
    >>> reduce(lambda x,y:x+y,[1,2,3,4,5,6]) #1+2+3+4+5+6
    21
    复制代码
    复制代码

    三:filter

    filter(...)
        filter(function or None, sequence) -> list, tuple, or string

    说明:

          对sequence中的item依次执行function(item),将执行结果为True(!=0)的item组成一个List/String/Tuple(取决于sequence的类型)返回,False则退出(0),进行过滤。

    例子:

    复制代码
    复制代码
    >>> def div(n):return n%2
    ... 
    >>> filter(div,range(5))                    #返回div输出的不等于0的真值
    [1, 3]
    >>> filter(div,range(10))
    [1, 3, 5, 7, 9]
    >>> filter(lambda x : x%2,range(10))        #lambda 函数返回奇数,返回列表
    [1, 3, 5, 7, 9]
    >>> filter(lambda x : not x%2,range(10))
    [0, 2, 4, 6, 8]
    >>> def fin(n):return n!='z'                #过滤'z' 函数,出现z则返回False
    ... 
    >>> filter(fin,'zhoujy')                    #'z'被过滤
    'houjy'
    >>> filter(lambda x : x !='z','zhoujy')     #labmda返回True值
    'houjy'
    >>> filter(lambda x : not x=='z','zhoujy')  #返回:字符串
    'houjy'
    复制代码
    复制代码

    上面的这些例子中都用到了一个 lambda表达式,下面举个例子,更多信息见这里

    >>> a=lambda x:x+3
    >>> a(2)
    5
    >>> a=lambda x,y:x+y
    >>> a(2,3)
    5

    四,应用map,reduce,filter

    1):实现5!+4!+3!+2!+1!

    复制代码
    复制代码
    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    def add_factorial(n):
        empty_list=[]           #声明一个空列表,存各个阶乘的结果,方便这些结果相加
        for i in map(lambda x:x+1,range(n)):    #用传进来的变量(n)来生成一个列表,用map让列表都+1,eg:range(5) => [1,2,3,4,5]
            a=reduce(lambda x,y:x*y,map(lambda x:x+1,range(i)))   #生成阶乘,用map去掉列表中的0
            empty_list.append(a)            #把阶乘结果append到空的列表中
        return empty_list
    if __name__ == '__main__':
        import sys
    #2选1
    #(一)
        try:
            n = input("Enter a Number(int) : ")
            result=add_factorial(n)   #传入变量
            print reduce(lambda x,y:x+y,result)      #阶乘结果相加
        except (NameError,TypeError):
            print "That's not a Number!"
    #(二)
    #    result = add_factorial(int(sys.argv[1]))   #传入变量
    #    print reduce(lambda x,y:x+y,result)      #阶乘结果相加
    复制代码
    复制代码

    结果:

    复制代码
    复制代码
    zhoujy@zhoujy:~/桌面/Python/4$ python factorial.py
    Enter a Number(int) : 1
    1
    zhoujy@zhoujy:~/桌面/Python/4$ python factorial.py
    Enter a Number(int) : 2
    3
    zhoujy@zhoujy:~/桌面/Python/4$ python factorial.py
    Enter a Number(int) : 3
    9
    zhoujy@zhoujy:~/桌面/Python/4$ python factorial.py
    Enter a Number(int) : 4
    33
    zhoujy@zhoujy:~/桌面/Python/4$ python factorial.py
    Enter a Number(int) : 5
    153
    zhoujy@zhoujy:~/桌面/Python/4$ 
    复制代码
    复制代码

    2):将100~200以内的质数挑选出来

    思路:

    质数是指:只有1和它本身两个因数,如2、3、5、7都是质数,即能被1和本身整除,1不是质数。
    比如一个数字N,看它是否质数的话,就要看:有没有能整除【2,N】之间的数X(不包含本身),即N%X是否为0,要是没有就为质数。
    所以我们要实现的算法是:拿一个数字N,去除以【2,N】之间的数X,来得到质数,即:N/2,N/3,……,N/N-2,N/N-1   ===> N/range(2,N)

    复制代码
    复制代码
    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    def is_prime(start,stop):
        stop  = stop+1     #包含列表右边的值
        prime = filter(lambda x : not [x%i for i in range(2,x) if x%i == 0],range(start,stop))   #取出质数,x从range(start,stop) 取的数
        print prime
    
    if __name__ == '__main__':
        try :
            start = input("Enter a start Number :")
        except :
            start = 2   #开始值默认2
        try :
            stop  = input("Enter a stop  Number :")
        except :
            stop  = 0   #停止数,默认0,即不返回任何值
        is_prime(start,stop)
    复制代码
    复制代码

    结果:

    复制代码
    复制代码
    zhoujy@zhoujy:~/桌面/Python/4$ python prime.py 
    Enter a start Number :
    Enter a stop  Number :10
    [2, 3, 5, 7]
    zhoujy@zhoujy:~/桌面/Python/4$ python prime.py 
    Enter a start Number :10
    Enter a stop  Number :20
    [11, 13, 17, 19]
    zhoujy@zhoujy:~/桌面/Python/4$ python prime.py 
    Enter a start Number :
    Enter a stop  Number :
    []
    复制代码
  • 相关阅读:
    1.打开windows中功能的快捷方式
    16-SQLServer强制走索引
    15-资源等待类型sys.dm_os_wait_stats
    14-SQLServer索引碎片
    13-修复数据库,表,索引
    12-SSMS图形化工具中不允许保存修改的解决办法
    11-常用SQL总结
    10-SQLServer中统计信息的使用
    Java连接mysql数据库
    递归方式的对变量中的特殊字符进行转义/去除转义
  • 原文地址:https://www.cnblogs.com/itdyb/p/6039381.html
Copyright © 2020-2023  润新知