本章主要介绍 python内置有用的集合工具类和方法、以及复数
1、 map
- map 集合元素转换另一种格式,可以理解一种映射公式,将变量代入公式算出值
- 语法
# function 就可以认为是公式,可以函数,也可以是lambda,lambda就是简写的语法糖而已
# map(function, iterable, ...)
- 例如
# 定义一个将摄氏度转换华氏度函数
def fahrenheit(celsius):
return (9/5)*celsius + 32
# 将摄氏度的列表
temps = [0, 22.5, 40, 100]
# 通过map转换成华氏度
F_temps = map(fahrenheit, temps)
# 打印转换华氏度的结果
print(list(F_temps))
# 其实可以用lambda式表达
list(map(lambda x : (9/5)*x + 32, temps))
# map可以接收多个参数,一般来说长度要一样,否则在以最短为准
a = [1,2,3,4]
b = [5,6,7,8]
c = [9,10,11,12]
print(map(lambda x,y:x+y, a, b))
# 三个数组的值相加
list(map(lambda x,y,z:x+y+z, a,b,c))
2、reduce
- reduce 循环累计结果与下一个元素作用,有点类似疯狂套娃, f(f(f(x))…) , reduce 是functools类中,需要导入类
- 语法
# reduce(function, iterable) 返回一个值
#[function(function(s1 ,s2),s3),...,sn]
from functools import reduce
# 累加
lst = [47,11,42,13]
print(reduce(lambda x,y: x+y,lst))
# 找出最大值
max_find = lambda a,b: a if(a > b) else b
print(reduce(max_find, lst))
3、filter
- 过滤器,过滤满足条件的元素
- 语法
# filter(function, iterable)
# function 过滤函数,返回bool值,true表示元素满足条件,false表示不满足条件, iterable表示过滤元素的集合
# 过滤偶数
def even_check(num):
if num%2 == 0:
return True
lst = range(20)
print(list(filter(even_check, lst)))
# 用lambda 表达式
print(list(filter(lambda x: x%2==0, lst)))
4、zip
- 可以将多个list按照下标合并一个元组,元组包含某个索引的对应多个list元素
- 如果多个list长度不一致,以最短为主
- 利用zip可以同时变量多个list,以索引作为一组
- 语法
# zip(iterable, iterable1,...)
## 将数组变成二元组
x = [1,2,3]
y = [4,5,6]
# [(1, 4), (2, 5), (3, 6)]
print(list(zip(x,y)))
# [(1, 4), (2, 5), (3, 6)]
x = [1,2,3]
y = [4,5,6,7,8]
print(list(zip(x,y)))
# 对于map 它默认存储是key [('a', 'c'), ('b', 'd')]
d1 = {'a':1, 'b':2}
d2 = {'c':4, 'd':5}
print(list(zip(d1,d2)))
# 可以是设置value [('c', 1), ('d', 2)]
print(list(zip(d2, d1.values())))
# 切换两个值 {'a': 4, 'b': 5}
def switcharoo(d1, d2):
dout = {}
for d1key, d2val in zip(d1, d2.values()):
dout[d1key] = d2val
return dout
print(switcharoo(d1,d2))
5、enumerate
-
将集合的索引标记出来,不需要定义额外变量,方便计数和索引位置
-
它也支持从某个位置开始遍历元素
-
语法
# enumerate(iterable)
# enumerate 如果为了计数或index,可以使用这个方法
lst = ['a','b','c']
for number, item in enumerate(lst):
print(number)
print(item)
for count, item in enumerate(lst):
if count >=2:
break
else:
print(item)
# 可以重写计数起始位置 [(3, 'March'), (4, 'April'), (5, 'May'), (6, 'June')]
months = ['March', 'April', 'May', 'June']
print(list(enumerate(months, start=3)))
6、all和any
- 集合中bool值判断函数,
- all表示集合元素都为True,方法返回true, 否则false
- any表示集合任意元素为True,方法返回true,否则false
# 语法
# all(iterable)
# any(iterable)
# all 所有条件都有满足, any只有满足一个条件
lst=[True, True, False, True]
print(all(lst))
print(any(lst))
7、complex(复数)
- 一般用于数学计算
- 语法
# complex(实数,虚数)
complex(2,3)
# (2+3j)
print(complex(2,3))
# (12+2j)
print(complex('12+2j'))
总结
1、一般函数定义都可以转成lambda的格式
2、对应函数可以嵌套多层, 比如 list(map(function,filter(filter_function,list)))
3、enumerate 和zip都是辅助变量数据,减少定义外部变量
4、filter一般会配合 map或reduce进行使用,过滤有效数据然后做一些处理
参考文档
- https://github.com/Pierian-Data/Complete-Python-3-Bootcamp.git