前文说列表那一节略有提到列表生成式,本篇会一起介绍一下列表、字典、集合生成式
1.列表生成式
[ experssion(或者函数) for item1 in 序列 if 判断语句
for item2 in 序列 if 判断语句
for item3 in 序列 if 判断语句
]
几种列表生成式的变形
1). [i**2 for i in range(2,10,2) ] 对[2,10)之间的偶数求平方
2). [fun(i) for i in range(2,10,2)] 对[2,10)之间的偶数进行函数fun()操作
3). [i**2 for i in range(2,10,2) if i%3==0] 对[2,10)之间的偶数且能被3整除的数求平方
4). [fun(i) for i in range(2,10,2) if i%3==0] 对[2,10)之间的偶数且能被3整除的数进行fun()操作
5). [fun(i) for i in range(2,10,2) if isFun(i)] 对满足isFun()函数且在[2,10)之间的偶数进行fun()操作
6). [fun1(i) if isFun(i) else fun2(i) for i in range(2,10,2)] [2,10)之间的偶数若满足isfun(i) 则进行Fun(i)否则进行fun2(2)
例:
1.找出1~10之间所有偶数, 并且返回一个列表, (包含以这个偶数为半径的圆的面积)
方法一:代码笨重, 这种类型建议改写为列表生成式
import math
li = []
for r in range(2,11,2): #[2,4,6,8,10]
square = math.pi * r * r
li.append(square)
print(li)
方法二:列表生成式,并将要返回的操作抽象为一个函数
import math
def square(r):
res = math.pi * r * r
return res
print([square(r) for r in range(2,11,2)])
方法三:一步到位
import math
print([math.pi * r * r for r in range(2,11,2)])
2. 找出1~10之间所有奇数, 并且返回一个列表, (所有的奇数转换为字符串)
import math
print([str(i) for i in range(1,11,2)])
3. 找出1~100之间所有的质数.
质数:只能被1和本身整除的数,就是质数。
方法:循环判断
若存在除了本身和1之外整除的数,则退出循环。
def isPrime(num):
for i in range(2, num):
if num % i == 0:
return False
else:
return True
print([i for i in range(2,101) if isPrime(i)])
ps:总是觉得这样时间复杂度太大了,大于5时,在初始质数[2,3,5]下判断一个是否能够被2,3,5整除,若不能整除则为质数,加入质数列表,依次对质数表中数整除判断质数,emmmmmmmm,现在脑子比较乱,这里记一个大概思路。
4.找出1~100之间所有奇数, 并且返回一个列表
(如果能被3整除, 返回返回该数的平方, 否则返回该数的三次方)
print([ i**2 if i % 3 == 0 else i**3 for i in range(1,101,2)])
5. 给定一个列表li = [2,3,4,5,6,3,1,4,5],如果是偶数返回0, 如果是奇数返回1
li = [2,3,4,5,6,1,4,5]
print([0 if i % 2 == 0 else 1 for i in li])
实现矩阵转置的方法:
li = [
[1,2,3,3,4],
[4,5,6,2,1],
[7,8,9,1,2]
]
方法一:通过列表生成式方法
li_re = [[ row[columnIndex] for row in li] for columnIndex in range(5)]
for i in li_re:
print(i)
运行结果:
方法二:内置函数zip
*li: 解包
zip:
1).打包函数, 用于将可迭代的对象作为参数,
将对象中对应的元素打包成一个个元组,
然后返回由这些元组组成的列表。
2).如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,
利用 * 号操作符,可以将元组解压为列表
3). zip 方法在 Python 2 和 Python 3 中的不同:
在 Python 3.x 中为了减少内存,zip() 返回的是一个对象。
li_re = list(zip(*li))
for i in li_re:
print(list(i))
2.字典生成式
[ key:values for item1 in 序列 if 判断语句
for item2 in 序列 if 判断语句
for item3 in 序列 if 判断语句
]
跟列表生成式类似,以下几道例题说明。
1: 假设有20个学生,学生分数在60-100之间,筛选出成绩在90分以上的学生
#首先生成20个学生的分数
import random
print({"student"+str(i):random.randint(60,100) for i in range(20)})
###改进前代码
stuInfo={}
for i in range(20):
name = "westos"+ str(i)
score = random.randint(60,100)
stuInfo[name] = score
stuInfo["westos"+ str(i)] = random.randint(60,100)
print(stuInfo)
#筛选处成绩90分以上的学生
import random
stuInfo = {"student"+str(i):random.randint(60,100) for i in range(20)}
print({name:score for name,score in stuInfo.items() if score>90})
###改进前代码:
highScore = {}
for name, score in stuInfo.items():
if score > 90:
highScore[name] = score
print(highScore)
这样看着舒服
2.随机生成电影清单
##字典生成式
import pprint
import random
pprint.pprint({
"user"+str(userItem):
{"film" + str(fileItem) for fileItem in range(random.randint(4,15))}
for userItem in range(10) })
##改进前代码
data = {} # 存储用户及喜欢电影清单的信息;
for userItem in range(100):
files = set([])
for fileItem in range(random.randint(4,15)):
files.add( "film" + str(fileItem))
data["user"+str(userItem)] = files
print(data)
3.将字典的key值和value值调换
将小写字母转换成大写字母
d = {'a':'apple', 'b':'bob', 'c':'come'}
print({v:k for k,v in d.items()})
print({k:k.upper() for k,v in d.items()})
运行结果如下:
4.大小写计数合并 : key值最终全部为小写
d1 = {'A':10, 'b':3, 'a':5, 'B':8, 'd':1}
print({k.lower(): d1.get(k.upper(),0)+d1.get(k.lower(),0) for k,v in d1.items()})
3.集合生成式
集合生成式与字典生成式类似,只是没有value值
例:
s = {1,2,3,4,5,6,7}
print({i**2 for i in s })