1. map(function, iterable) 函数
参数:
function: 一个函数, 可以是自定义的, 也可以是内置的
iterable: 一个可迭代的对象
功能:
逐一取出 iterable 参数中的值, 并根据 function 参数的规则执行, 最后返回一个迭代器 iterator
返回值:
一个迭代器
演示代码:
# 计算已知列表中的每一个数的平方 # 普通计算的方式也许是这样 lst = [1, 2, 3, 4, 5] res_lst = [] for i in lst: res_lst.append(i ** 2) # 或者使用推导式, 比如这样 lst = [1, 2, 3, 4, 5] res_lst = [x*x for x in lst] # 而使用 map 函数可以这样 lst = [1, 2, 3, 4, 5] res_iter = map(lambda x: x * x, lst)
res_lst = list(res_iter)
LeetCode 第13题, 罗马数字:
# 计算出一个已知罗马数字的数列所对应的值 (题目参考 LeetCode 第13题) def romanToInt(s): code = {'M': 1000, 'D': 500, 'C': 100, 'L': 50, 'X': 10, 'V': 5, 'I': 1} ans = 0 for i in range(len(s) - 1): # such as CM if code[s[i]] < code[s[i + 1]]: ans -= code[s[i]] else: ans += code[s[i]] return ans + code[s[-1]] # 那么使用 map 就显得有些优势了, 再自己验证自己的算法结果的时候, 就可以不一个个的验证了 strs = ['III', 'IV', 'IX', 'LVIII', 'MCMXCIV'] print(list(map(romanToInt, strs)))
执行结果:
[3, 4, 9, 58, 1994]
2. sorted(iterable, *, key=None, reverse=False) 函数
与 list 的 sort 方法相似, 但不同的是, sort 直接改变了原来列表的值.
参数: iterable: 可迭代型数据(常用: 容器类型数据 range对象 迭代器) reverse = False 从小到大排序(升序, 正序) reverse = True 从大到小排序(降序, 倒序) key = 一个函数
功能: 排序 把可迭代性的数据进行排序.
返回值: 排序后的结果
示例1:
# 一组学生姓名和成绩, 使用 sorted 进行排序 lst = [('Bob', 75), ('Adam', 92), ('Trent', 99), ('Lisa', 88)] res = sorted(lst) # sorted 与 sort 函数不同, sorted 不会改变原数据, 就近比较 print(res) print(lst)
执行结果:
排序后: [('Adam', 92), ('Bob', 75), ('Lisa', 88), ('Trent', 99)] 原数据: [('Bob', 75), ('Adam', 92), ('Trent', 99), ('Lisa', 88)]
示例2:
# 一组学生姓名和成绩, 使用 sorted 根据成绩进行降序排序 lst = [('Bob', 75), ('Adam', 92), ('Trent', 99), ('Lisa', 88)] res = sorted(lst, key=lambda tp: tp[1], reverse=True) print(res)
执行结果:
[('Trent', 99), ('Adam', 92), ('Lisa', 88), ('Bob', 75)]
3. functools.
reduce
(function, iterable[, initializer]) 函数
参数:
function: 内置函数 或者 自定义函数
iterable: 可迭代性数据
功能:
依次将 iterable 中的前两个数据取出, 依据 function 制定的规则计算结果, 再将结果与第三个元素计算, 依次类推.
返回值:
计算的最终结果
演示代码:
# 将一个列表的数变为一个整数, python3.7 from functools import reduce lst = [2, 0, 1, 9] res = reduce(lambda x, y: x * 10 + y, lst) print(res)
执行结果:
2019
leetcode 120. Triangle 例子
当使用两个循环来做运算的时候, 就可以考虑使用 reduce
from functools import reduce class Solution: def minimumTotal(self, triangle): """ :type triangle: List[List[int]] :rtype: int """ # if not triangle: # return 0 # ans = triangle[-1] # for i in range(len(triangle) - 2, -1, -1): # for j in range(len(triangle[i])): # ans[j] = triangle[i][j] + min(ans[j], ans[j+1]) # return ans[0] return reduce(lambda r1, r2: [c+min(a, b) for a, b, c in zip(r1, r1[1:], r2)], triangle[::-1])[0]
4. filter(function, iterable) 函数
参数:
function: 一个函数
iterable: 可迭代型数据
功能:
根据function的返回值, 进行过滤数据, 如果function 的返回值为真则保留, 否则舍弃
返回值:
一个迭代器
演示代码:
f = filter(lambda x: 2 < x < 10 and x % 2 == 0, [v for v in range(18)]) lst = list(f) print(lst)
执行结果:
[4, 6, 8]