各种推导式
列表推导式和生成器推导式
导引
1 egg_list=['鸡蛋%s'%i for i in range(10)] 2 print(egg_list) 3 4 #方法二,下面的代码也能够实现上述功能,但是代码明显复杂许多 5 # egg_list=[] 6 # for i in range(10): 7 # egg_list.append('鸡蛋%s'%i) 8 # print(egg_list)
上述代码中的i for i in range(10)这段就叫做列表推导式,它能够大大简化代码,由以上对比可知
列表推导式的更一般形式:print([i for i in range(10)])
1 #生成器表达式 2 g=(i for i in range(10)) 3 print(g)#返回结果是一个生成器 4 for i in g: 5 print(i)
列表推导式和生成器推导式的区别:
括号不一样,
返回值不一样:
列表推导式返回值是列表;生成器表达式返回值是生成器。
占用内存对比:
列表推导式一下子生成所有的结果占用内存;
生成器表达式相比之下,占用内存较少
列表推导式的额一般形式:
[每一个元素或者元素相关的操作 for 元素 in 可迭代数据类型],相当于遍历之后挨个处理
更一般的形式:
[满足条件的元素相关的操作 for 元素 in 可迭代数据类型 if 元素相关的条件],这种形式相当于筛选功能、
列表推导式的小例子
1 # #30以内所有能被3整除的数字 2 # print([i for i in range(30) if i%3==0])#这就是一个完整的列表推导式 3 # 4 # #30以内所有能被3整除的数字的平方 5 # print([i*i for i in range(30) if i%3==0])#这就是一个完整的列表推导式 6 7 #嵌套列表中名字含有两个e的所有名字 8 names=[['Tom','Billy','Jefferson','Andrew','Wesley','Steven','Joe'],['Alice','Jill','Ana','Wendy','Jennifer','Sherry','Eva']] 9 print([name for list in names for name in list if name.count('e')==2])#注意这里的写法,套用两个for循环,其次找出两个'e',直接用name.count,新知识 10 #注意写代码需要注意可读性可简洁性,但是这两个要求有时候是矛盾的。但是如果非要取舍,那么就首选可读性,比如上面的这段代码,比较复杂,可读性不强,一旦中间出现错误,不容易查找,所以还不如写两个for循环
字典推导式
1 # #将字典中的key和value对调 2 # mcase={'a':10,'b':34} 3 # mcase_frequency={mcase[k]:k for k in mcase}#注意mcase[k]就是value,自己这里有点懵了 4 # print(mcase_frequency) 5 6 7 #合并大小写对应的value值,将k统一成小写 8 mcase={'a':10,'b':34,'A':7,'z':3} 9 mcase_frequency={k.lower():mcase.get(k.lower(),0)+mcase.get(k.upper(),0) for k in mcase}#注意mcase[k]就是value,自己这里有点懵了 10 print(mcase_frequency) 11 12 13 D:\anoconda\python.exe F:/python/python学习/人工智能/第一阶段day2/2.作业.py 14 {'a': 17, 'b': 34, 'z': 3} 15 16 Process finished with exit code 0
增加一个小知识点
1 d={'a':10} 2 print(d.get('b'))#因为没有b,但是结果不会报错而是会出现none 3 print(d.get('b',0))#注意如果没有后面这个0的话,那么结果就是none 4 5 6 D:\anoconda\python.exe F:/python/python学习/人工智能/第一阶段day2/2.作业.py 7 None 8 0 9 10 Process finished with exit code 0
集合推导式
1 #注意集合有一个重要的功能:去重 2 squqred={x**2 for x in [1,-1,2]}#这里面1和-1的平方都是1,但是根据集合的去重功能,直接去除了多余的1 3 print(squqred) 4 #结果是{1, 4} 5 6 7 8 #如果是列表推导式 9 squqred=[x**2 for x in [1,-1,2]] 10 print(squqred) 11 #结果是[1, 1, 4],两个1
注意有列表、字典、集合推导式,但是却没有元组推导式:
原因:
1、列表推导式外面是两个圆括号,这样就变成了生成器
2、元组中的数都是不可变的数据类型
总结:
主要讲了各种推导式有遍历操作和筛选操作两种形式。
作业
1、过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
1 #过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母 2 li=['sdf','khgj','dhgjf','hj'] 3 print([i.upper() for i in li if len(i)>=3]) 4 5 D:\anoconda\python.exe F:/python/python学习/人工智能/第一阶段day2/2.作业.py 6 ['SDF', 'KHGJ', 'DHGJF'] 7 8 Process finished with exit code 0
2、求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表
1 #求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表 2 li1=[i for i in range(5) if i%2==0] 3 li2=[i for i in range(5) if i%2==1] 4 print((li1,li2))#题意完全理解错误 5 6 #老师的答案 7 print([(x,y) for x in range(5) if x%2==0 for y in range(5) if y %2==1])
3、求M中3,6,9组成的列表M = [[1,2,3],[4,5,6],[7,8,9]]
1 #求M中3,6,9组成的列表M = [[1,2,3],[4,5,6],[7,8,9]] 2 M = [[1,2,3],[4,5,6],[7,8,9]] 3 print([i[2] for i in M])#这道题自己没有想出来,这是老师的答案