推导
推导式是Python中很强大的、很受欢迎的特性,具有语言简洁,速度快等优点。推导式包括:
1.列表推导式
2.字典推导式
3.集合推导式
1).列表推导式 []
#100以内整除3的数字列表
不使用推导:
numbers = []
for x in range(1,101):
if x % 3 == 0:
numbers.append(x)
print(numbers)
使用推导:
nums=[x for x in range(1,100) if x%3==0]
print(nums)
注意的是,列表使用的是[],如果使用()将生成一个生成器,如下:
#()创造了一个生成器 并没有被执行,
nums2=(x for x in range(1,101) if x%3==0)
print(nums2.__next__()) #输出3
print([x for x in nums2]) #输出可以被3整除的数字组成的列表
2).字典推导式 {}
字典推导和列表推导的使用方法是类似的,只不过中括号该改成大括号。直接举例说明:
将字典中的key 和value 置换
若不适用推导:
mcase={'a':10,'b':20}
new_m={}
for k in mcase.keys():
new_m[mcase[k]]=k
print(new_m)
#得到{10:'a',20:'b'}
使用推导:
mcase={'a':10,'b':20}
mcase2={v:k for k,v in mcase.items()}
print(mcase2)
3).集合推导式
集合推导式也使用{},和字典推导式不同之处在于字典推导式中存在key和value,所以是否存在: 可以快速判断。
(1).将一组数平方并输出
squared={x**2 for x in (1,2,3,4,5,6,7,8,8)}
print(squared)
#得到{64, 1, 4, 36, 9, 16, 49, 25}
这里注意的是,因为是集合,所以输出的结果唯一且无序。
(2).使用推导将一组字符串长度返回,并将长度在3以上的字符串输出
strings = ['a','is','with','if','file','exception']
len1={len(s) for s in strings}
lens={s.upper() for s in strings if len(s)>3}
print(len1) #{2,1,4,9} 拥有相同长度只会保留一个
print(lens) #{'WITH', 'FILE', 'EXCEPTION'}
(3).求(x,y)其中x是1-5之间的偶数,y是1-5之间的奇数组成的元祖列表
不适用推导:
zzr=[]
for x in range(1,6):
if x%2==0:
for y in range(1,6):
if y%2==1:
zzr.append((x,y))
print(zzr)
使用推导:
yuanzu=[(x,y) for x in range(1,6) if x%2==0 for y in range(1,6) if y%2==1]
print(yuanzu)
(4).[[1, 2, 3], [4, 5, 6], [7, 8, 9]] 求此列表中将3,6,9输出,延斜线将1,5,9输出,延反斜线将3,5,7输出
3,6,9:
m=[[1,2,3],[4,5,6],[7,8,9]]
mm=[x[2] for x in m]
print(mm)
这里是将m中每个列表中下标为2的元素输出
1,5,9:
m=[[1,2,3],[4,5,6],[7,8,9]]
mmm=[[m[x][x] for x in range(len(m))]]
print(mmm)
这里是考虑到输出的值的大下标与小下标相等
3,5,7:
m=[[1,2,3],[4,5,6],[7,8,9]]
mmmm=[[m[x][len(m)-1-x] for x in range(len(m))]]
print(mmmm)
这里x遍历的是m的长度,但是要注意的是长度是1,2,3,但是下标的取值确实从0开始,所以需要m的长度减一,否则会报错下标越界
(5).求m,n中矩阵各个元素的乘积
kk = [[1,2,3],[4,5,6],[7,8,9]]
ll = [[2,2,2],[3,3,3],[4,4,4]]
kk=[[1,2,3],[4,5,6],[7,8,9]]
ll=[[2,2,2],[3,3,3],[4,4,4]]
#第一种
kl=[kk[i][j]*ll[i][j] for i in range(len(kk)) for j in range(len(kk[i]))]
print(kl)
#第二种
kkl=[[kk[i][j]*ll[i][j] for j in range(len(kk[i]))] for i in range(len(kk))]
print(kkl)
#第三种
llk=[[kk[j][i]*ll[j][i] for j in range(len(kk[i]))] for i in range(len(kk))]
print(llk)
输出结果如下:
[2, 4, 6, 12, 15, 18, 28, 32, 36]
[[2, 4, 6], [12, 15, 18], [28, 32, 36]]
[[2, 12, 28], [4, 15, 32], [6, 18, 36]]
第一种方法首先使i遍历range(len(kk)),i获取的即为[1,2,3],[4,5,6],[7,8,9]这三组列表,再使j遍历i,得到具体的每个值,最终输出
kk[i][j]*ll[i][j]是两组列表每个元素上下对应的的乘积。
第二种方法是先用i遍历range(len(kk)),在要输出的内容里继续推导,因为是kk[i][j],当i为0时,j遍历kk[0]的值,以此类推,得到输出结果。
第三种方法是与第二种类似,但不同之处在于输出的是kk[j][i],这就相当于当j为0时,会输出kk[0][1],kk[0][2],kk[0][3],即2,12,28三个数,并组成一个列表输出。
(6).结合两个列表的元素,如果元素之间不相等的话
a1=[1,2,3]
b1=[2,1,4]
print([(x,y) for x in a1 for y in b1 if x!=y])
#输出得到
[(1, 2), (1, 4), (2, 1), (2, 4), (3, 2), (3, 1), (3, 4)]
这个例子就较容易理解,即先执行两个for循环,再书写if判断条件,将满足条件的(x,y)输出即可
(7).将(1,6)中的数以(x,x**2)的形式输出
print((x,x**2) for x in range(1,6))