python中的map、reduce、filter、sorted函数
map、reduce、filter、sorted函数,这些函数都支持函数作为参数。
-
map函数
- map() 函数语法:map(function, iterable, ...)
- function -- 函数
- iterable -- 一个或多个序列
map()接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。
例如,对于list [1, 2, 3, 4, 5, 6, 7, 8, 9] 如果希望把list的每个元素都作平方,就可以用map()函数: 因此,我们只需要传入函数f(x)=x*x,就可以利用map()函数完成这个计算:
def f(x): return x*x for i in map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9]): print(i) # 输出结果:1, 4, 9, 10, 25, 36, 49, 64, 81
注意:map()函数不改变原有的 list,而是返回一个新的 list。
利用map()函数,可以把一个 list 转换为另一个 list,只需要传入转换函数。
由于list包含的元素可以是任何类型,因此,map() 不仅仅可以处理只包含数值的 list,事实上它可以处理包含任意类型的 list,只要传入的函数f可以处理这种数据类型。 假设用户输入的英文名字不规范,没有按照首字母大写,后续字母小写的规则,请利用map()函数,把一个list(包含若干不规范的英文名字)变成一个包含规范英文名字的list: 输入:['adam', 'LISA', 'barT'] 输出:['Adam', 'Lisa', 'Bart']
a = ['adam', 'LISA', 'barT'] def format_name(a): result = a[0:1].upper()+a[1:].lower() return result for i in map(format_name,a): print(i) # 输出结果: Adam Lisa Bart
-
reduce函数
- reduce() 函数语法:reduce(function, iterable[, initializer])
- function -- 函数,有两个参数
- iterable -- 可迭代对象
- initializer -- 可选,初始参数
reduce接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。
例如,编写一个f函数,接收x和y,返回x和y的和:
def add(x,y): return x+y
调用 reduce(f, [1, 3, 5, 7, 9])时,reduce函数将做如下计算:
1
2
3
4
5
|
先计算头两个元素:f( 1 , 3 ),结果为 4 ; 再把结果和第 3 个元素计算:f( 4 , 5 ),结果为 9 ; 再把结果和第 4 个元素计算:f( 9 , 7 ),结果为 16 ; 再把结果和第 5 个元素计算:f( 16 , 9 ),结果为 25 ; 由于没有更多的元素了,计算结束,返回结果 25 。 |
reduce()还可以接收第3个可选参数,作为计算的初始值。如果把初始值设为100,计算:
1
|
reduce (f, [ 1 , 3 , 5 , 7 , 9 ], 100 ) |
结果将变为125。
示例:
from functools import reduce a = [1,2,3,4,5] def f(x,y): return x+y print(reduce(f,a,100)) # 输出结果:115
更加高级的用法,根据字典的性别进行分类:
from functools import reduce scientists =({'name':'Alan Turing', 'age':105, 'gender':'male'}, {'name':'Dennis Ritchie', 'age':76, 'gender':'male'}, {'name':'Ada Lovelace', 'age':202, 'gender':'female'}, {'name':'Frances E. Allen', 'age':84, 'gender':'female'}) def group_by_gender(a,b): a[b['gender']].append(b['name']) return a print(reduce(group_by_gender,scientists,{'male':[],'female':[]}))
-
filter函数
-
filter(function, iterable)
- function -- 判断函数。
- iterable -- 可迭代对象。
filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。该函数接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
a = [1,2,3,4,5,6,7,8,9,10] def is_odd(x): if x%2 == 0: return x for i in filter(is_odd,a): print(i) # 输出结果:2 4 6 8
-
sorted函数
- sorted(iterable,key,reverse)
- iterable表示可以迭代的对象
- key表示选取参与比较的元素
- reverse则是用来指定排序是倒序还是顺序,reverse=true则是倒序,reverse=false时则是顺序
示例:根据字典的值对字典进行排序:
dict = {"a":20,"b":60,"c":10,"d":50} print(sorted(dict.items(), key=lambda x: x[1]))