各种推导式

列表推导式和生成器推导式

导引

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])#这道题自己没有想出来,这是老师的答案

 

posted @ 2019-01-26 23:07  舒畅123  阅读(220)  评论(0编辑  收藏  举报