python学习15

推导

推导式是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))






猜你喜欢

转载自blog.csdn.net/gy_334/article/details/80430313
今日推荐