1. map/reduce函数
// map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
def f(x):
return x**2
list = [1,2,3,4,5,6]
>>> result = map(f,list)
>>> list(result) # Iterator是惰性序列,因此通过list()函数让它把整个序列都计算出来并返回一个list
[1, 4, 9, 16, 25, 36]
// reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算。
# reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
eg:
def add(x,y):
return x+y
reduce(add,[1, 3, 5, 7, 9])
# 过程是 add(add(add(add(1,3),5),7),9) 1+3 +5 +7 +9 =>
>>> 25
// 应用:实现一个函数,能把string转化为int
>>> from functools import reduce
>>> def char2number(s):
... dict = {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}
... return dict[s]
...
>>> def fn(x,y):
... return x *10 +y
...
>>> reduce(fn,map(char2number,'13579'))
13579
>>>
# 整理一下
from functools import reduce
DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
def str2int(s):
def char2num(s):
return DIGITS[s]
def fn(x,y):
return x*10+y
return reduce(fn,map(char2num,s))
# 用lambda函数进一步简化成:
from functools import reduce
DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
def char2num(s):
return DIGITS[s]
def str2int(s):
return reduce(lambda x,y: x*10+y,map(char2num,s))
2. filter:Python内建的filter()函数用于过滤序列
// filter两个参数:
filter(指向参数是队列对象函数的变量,指向list的变量)
// 筛选奇数
def is_odd(n):
return n % 2 == 1
list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
>>> [1, 5, 9, 15]
// 空字符串删掉
def not_empty(s):
return s and s.strip()
list(filter(not_empty, ['A', '', 'B', None, 'C', ' ']))
>>> ['A', 'B', 'C']
3. sorted:Python内建的sorted()函数用于排序序列
// sorted()函数就可以对list进行排序:
# 直接排序
>>> sorted([36, 5, -12, 9, -21])
[-21, -12, 5, 9, 36]
# 指定key(key指定的函数将作用于list的每一个元素上,并根据key函数返回的结果进行排序)
>>> sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)
['about', 'bob', 'Credit', 'Zoo']
# reverse结果反转,参数类型是指向bool类型的变量
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
['Zoo', 'Credit', 'bob', 'about']
// 实际运用的例子:
# -*- coding: utf-8 -*-
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
def by_name(t):
return t[0]
def by_score(t):
return -t[1]
L2 = sorted(L, key=by_name)
print(L2)
L3 = sorted(L, key= by_score)
print(L2)
总结:
key指定的函数将作用于list的每一个元素上,并根据key函数返回的结果进行排序.所以key指向的函数要有返回值,参数是list的每一个元素。
网友评论