019.Python函数sorted,filter和推导式
一 sorted函数
sorted(iterable,reverse=False,key=函数)
功能:排序 参数: iterable:可迭代性数据(常用:容器类型数据,range对象,迭代器) reverse : 是否倒序 默认正序reverse= False(从小到大) 如果reverse=True 代表倒序 (从大到小) key = 自定义函数 或者 内置函数 返回值: 排序的序列
1.1 从小到大默认排序
listvar = [1,2,-88,-4,5] # 从小到大默认排序 res = sorted(listvar) print(res)
执行
[root@node10 python]# python3 test.py [-88, -4, 1, 2, 5]
1.2 从大到小排序
listvar = [1,2,-88,-4,5] res = sorted(listvar,reverse=True) print(res)
执行
[root@node10 python]# python3 test.py [5, 2, 1, -4, -88]
1.3 按照绝对值排序
需要用到内置函数abs(绝对值函数)
res = abs(-1.5) print(res) listvar = [1,2,-88,-4,5] res = sorted(listvar,key=abs) print(res)
执行
[root@node10 python]# python3 test.py 1.5 [1, 2, -4, 5, -88]
1.4 按照余数排列
listvar = [19,23,44,57] def func(n): return n % 10 res = sorted(listvar,key=func) print(res) listvar = [4,1,2,9] listvar.sort() print(listvar)
执行
[root@node10 python]# python3 test.py [23, 44, 57, 19] [1, 2, 4, 9]
sort 基于原有列表进行修改
sorted 是产生一个新列表
二 filter函数
filter(func,iterable)
功能:过滤数据
如果函数的返回值是True ,代表保留当前数据
如果函数逇返回值是False,代表舍弃当前数据
参数:
func 自定义函数
iterable 可迭代对象(常用:容器类型数据,range对象,迭代器)
返回值
迭代器
取出所有的偶数
listvar = [1,2,3,4,4,56,6,6,7,8,9,10] # 要所有的偶数,舍弃所有的奇数 def func(n): if n % 2 == 0: return True else: return False it = filter(func,listvar) res = list(it) print(res)
执行
[root@node10 python]# python3 test.py [2, 4, 4, 56, 6, 6, 8, 10]
使用匿名函数优化
listvar = [1,2,3,4,4,56,6,6,7,8,9,10] # 要所有的偶数,舍弃所有的奇数 it = filter(lambda n :True if n % 2 == 0 else False,listvar) print(list(it))
执行
[root@node10 python]# python3 test.py [2, 4, 4, 56, 6, 6, 8, 10]
三 推导式
- 通过一行循环判断,遍历出一系列数据的方式是推导式 (简洁方便)
3.1 列表推导式
[1,2,3,4] => [2,4,6,8]
lst = [] for i in range(1,5): print(i) lst.append(i) print(lst)
执行
1
2
3
4
[1, 2, 3, 4]
推导式写法
listvar = [i for i in range(1,5)] print(listvar) listvar = [i*2 for i in range(1,5)] print(listvar)
执行
[root@node10 python]# python3 test.py [1, 2, 3, 4] [2, 4, 6, 8]
3.1.1 带有判断条件的列表推导式
[1,2,3,4,4,5,9,6] 只要奇数
lst = [1,2,3,4,4,5,9,6] lst2 = [] for i in lst: if i % 2 == 1: lst2.append(i) print(lst2) #推导式写法 res = [i for i in lst if i % 2 == 1] print(res)
执行
[root@node10 python]# python3 test.py [1, 3, 5, 9] [1, 3, 5, 9]
3.1.2 带有双循环的列表推导式
lst1 = [1,2,3] lst2 = [4,5,6] for i in lst1: for j in lst2: print("%d*%d=%2d " % (i,j,i*j))
#使用推导式 res = ["%d*%d=%2d " % (i,j,i*j) for i in lst1 for j in lst2] print(res)
执行
[root@node10 python]# python3 test.py 1*4= 4 1*5= 5 1*6= 6 2*4= 8 2*5=10 2*6=12 3*4=12 3*5=15 3*6=18 ['1*4= 4 ', '1*5= 5 ', '1*6= 6 ', '2*4= 8 ', '2*5=10 ', '2*6=12 ', '3*4=12 ', '3*5=15 ', '3*6=18 ']
3.1.3 带有条件判断的多循环推导式
使用两个列表,第一行的和第二行对应相乘
lst1 = [1,2,3] lst2 = [4,5,6] for i in lst1: for j in lst2: if lst1.index(i) == lst2.index(j): print ("%d*%d=%2d " % (i,j,i*j)) res = ["%d*%d=%2d " % (i,j,i*j) for i in lst1 for j in lst2 if lst1.index(i) == lst2.index(j)] print(res)
第一行的奇数和第二行的偶数相乘,并打印
lst1 = [1,2,3,4] lst2 = [5,6,7,8] for i in lst1: for j in lst2: if i % 2== 1 and j %2 == 0: print ("%d*%d=%2d " % (i,j,i*j))
#是用推导式 res = ["%d*%d=%2d " % (i,j,i*j) for i in lst1 for j in lst2 if i % 2== 1 and j %2 == 0] print(res)
执行
1*6= 6 1*8= 8 3*6=18 3*8=24 ['1*6= 6 ', '1*8= 8 ', '3*6=18 ', '3*8=24 ']
推导式的后面:只能是循环或者 判断(单项分支 只有一个if 没有其他的了)
如果你需要这个值,就把这个值放到for的最左边.
3.2 集合推导式
setvar = {} 代表字典 () 代表空元祖 (1) 代表整型1 (1,) 代表元组 set() 代表空集合
案例:判断一个VIP会员
条件:(1)满足年龄在18到21,存款大于等于5000小于等于5500的人,
统计结果:尊贵VIP卡老x(姓氏),否则开卡格式为:普通会员老*(姓氏)
listvar = [ {"name":"王大宝","age":18,"money":10000}, {"name":"王二宝","age":19,"money":5100}, {"name":"王三宝","age":20,"money":4800}, {"name":"李大宝","age":21,"money":2000}, {"name":"李二宝","age":180,"money":20} ] setvar = set() print(type(setvar)) for i in listvar : if 5000 <=i['money'] <= 5500 and 18 <= i['age'] <= 21: setvar.add("尊贵vip老"+i['name'][0]) else: setvar.add("普通会员卡老"+i['name'][0]) print(setvar) #使用三目运算符+推导式 setvar={"尊贵vip老"+i['name'][0] if 5000 <=i['money'] <= 5500 and 18 <= i['age'] <= 21 else "普通会员卡老"+i['name'][0] for i in listvar} print(setvar)
执行
[root@node10 python]# python3 test.py <class 'set'> {'普通会员卡老王', '尊贵vip老王', '普通会员卡老李'} {'普通会员卡老王', '尊贵vip老王', '普通会员卡老李'}
3.3 字典推导式
3.3.1 enumerate函数
enumerate(iterable,[start=0]) #start是一个可选对象
功能:枚举 ; 将索引号和iterable中的值,一个一个拿出来配对组成元组放入迭代器中
参数:
iterable: 可迭代性数据 (常用:迭代器,容器类型数据,可迭代对象range)
start: 可以选择开始的索引号(默认从0开始索引)
返回值:迭代器
案例
listvar = ["a","b","c","d"] res = enumerate(listvar) print (res)
执行
[root@node10 python]# python3 test.py <enumerate object at 0x7f3c3f505750>
使用迭代器
listvar = ["a","b","c","d"] res = enumerate(listvar) print (res) # Iterator 迭代器 Iterable 可迭代对象 from collections import Iterator,Iterable print(isinstance(res,Iterator)) print(list(res))
执行
[root@node10 python]# python3 test.py <enumerate object at 0x7f7851fc4750> True [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]
特别指定开始值是14 不是默认0
listvar = ["a","b","c","d"] res = enumerate(listvar) print (res) # Iterator 迭代器 Iterable 可迭代对象 from collections import Iterator,Iterable print(isinstance(res,Iterator)) print(list(res)) res = enumerate(listvar,start=14) print(list(res))
执行
[root@node10 python]# python3 test.py <enumerate object at 0x7f04d1b42708> True [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')] [(14, 'a'), (15, 'b'), (16, 'c'), (17, 'd')]
转换为字典
listvar = ["a","b","c","d"] res = enumerate(listvar) print (res) # Iterator 迭代器 Iterable 可迭代对象 from collections import Iterator,Iterable print(isinstance(res,Iterator)) print(list(res)) res = enumerate(listvar,start=14) print(list(res),type(list(res))) #转换 lst = [(14, 'a'), (15, 'b'), (16, 'c'), (17, 'd')] res = dict(lst) print (res)
执行
[root@node10 python]# python3 test.py <enumerate object at 0x7f2f5ceb3750> True [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')] [(14, 'a'), (15, 'b'), (16, 'c'), (17, 'd')] <class 'list'> {14: 'a', 15: 'b', 16: 'c', 17: 'd'}
使用enumrate实现字典推导式
listvar = ["a","b","c","d"] res = enumerate(listvar) print (res) # Iterator 迭代器 Iterable 可迭代对象 from collections import Iterator,Iterable print(isinstance(res,Iterator)) print(list(res)) res = enumerate(listvar,start=14) print(list(res),type(list(res))) lst = [(14, 'a'), (15, 'b'), (16, 'c'), (17, 'd')] res = dict(lst) print (res) dictvar = {a:b for a,b in enumerate(listvar,start=9)} print (dictvar)
执行
<enumerate object at 0x7f28329d1900> True [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')] [(14, 'a'), (15, 'b'), (16, 'c'), (17, 'd')] <class 'list'> {14: 'a', 15: 'b', 16: 'c', 17: 'd'} {9: 'a', 10: 'b', 11: 'c', 12: 'd'}
可以直接使用dict强转
listvar = ["a","b","c","d"] res = enumerate(listvar) print (res) # Iterator 迭代器 Iterable 可迭代对象 from collections import Iterator,Iterable print(isinstance(res,Iterator)) print(list(res)) res = enumerate(listvar,start=14) print(list(res),type(list(res))) lst = [(14, 'a'), (15, 'b'), (16, 'c'), (17, 'd')] res = dict(lst) print (res) dictvar = {a:b for a,b in enumerate(listvar,start=9)} print (dictvar) res = dict(enumerate(listvar,start=10)) print (res)
执行
<enumerate object at 0x7f54f8c10900> True [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')] [(14, 'a'), (15, 'b'), (16, 'c'), (17, 'd')] <class 'list'> {14: 'a', 15: 'b', 16: 'c', 17: 'd'} {9: 'a', 10: 'b', 11: 'c', 12: 'd'} {10: 'a', 11: 'b', 12: 'c', 13: 'd'}
3.3.2 zip
zip(iterable, ... ...) 功能: 将多个iterable中的值,一个一个拿出来配对组成元组放入迭代器中 iterable: 可迭代性数据 (常用:迭代器,容器类型数据,可迭代对象range) 返回: 迭代器 # 注意:2个值得索引号需要相同,如果有余出的自动舍弃.
案例
from collections import Iterator,Iterable list1 = ["a","b","c","d"] list2 = [1,2,3,4,5,6,7,8,8,9,99,0,0] it = zip(list1,list2) print(isinstance(it,Iterator)) print(list(it)) #返回值 [('a', 1), ('b', 2), ('c', 3), ('d', 4)] # 利用zip实现字典推导式 dic = { k:v for k,v in zip(list1,list2) } print(dic) # 利用dict 强转zip迭代器变成字典 res = dict(zip(list1,list2)) print(res)
执行
[root@node10 python]# python3 test.py True [('a', 1), ('b', 2), ('c', 3), ('d', 4)] {'a': 1, 'b': 2, 'c': 3, 'd': 4} {'a': 1, 'b': 2, 'c': 3, 'd': 4}
作者:梦中泪
关于作者:云计算,linux,虚拟化,存储
---------------------------------------------------------------------------
个性签名:我以为我很颓废,今天我才知道,原来我早报废了。
如果觉得本篇文章最您有帮助,欢迎转载,且在文章页面明显位置给出原文链接!记得在右下角点个“推荐”,博主在此感谢!