Python中的列表、字典、集合生成式

前文说列表那一节略有提到列表生成式,本篇会一起介绍一下列表、字典、集合生成式

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 })

猜你喜欢

转载自blog.csdn.net/weixin_41179709/article/details/81751117