Python之map、reduce、filter

来源:互联网 发布:lol 省一 知乎 编辑:程序博客网 时间:2024/05/16 16:08

原文地址:http://www.cnblogs.com/zhoujinyi/archive/2013/06/07/3121976.html

下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+...+945>>> reduce(add,range(11))        #1+2+3+...+1055>>> reduce(lambda x,y:x*y,range(1,3),5)           #lambda 函数,5是初始值, 1*2*510>>> reduce(lambda x,y:x*y,range(1,6))             #阶乘,1*2*3*4*5120>>> reduce(lambda x,y:x*y,range(1,6),3)           #初始值3,结果再*3360
>>> 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 -*-# 5! + 4! + 3! + 2! + 1!import sysf1 = lambda x: range(1,x+1)f2 = lambda x,y: x*ydef factorial(x):  return reduce(f2,f1(x))def f3(x):  return map(factorial,range(1,x+1))print reduce((lambda x,y: x+y),f3(int(sys.argv[1])))


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 primeif __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 :10Enter a stop  Number :20[11, 13, 17, 19]zhoujy@zhoujy:~/桌面/Python/4$ python prime.py Enter a start Number :Enter a stop  Number :[]
复制代码
gv[1]))   #传入变量#    print reduce(lambda x,y:x+y,result)      #阶乘结果相加
复制代码

结果:

复制代码
zhoujy@zhoujy:~/桌面/Python/4$ python factorial.pyEnter a Number(int) : 11zhoujy@zhoujy:~/桌面/Python/4$ python factorial.pyEnter a Number(int) : 23zhoujy@zhoujy:~/桌面/Python/4$ python factorial.pyEnter a Number(int) : 39zhoujy@zhoujy:~/桌面/Python/4$ python factorial.pyEnter a Number(int) : 433zhoujy@zhoujy:~/桌面/Python/4$ python factorial.pyEnter a Number(int) : 5153zhoujy@zhoujy:~/桌面/Python/4$ 
复制代码
0 0
原创粉丝点击