什么时候改用列表生成式和字典生成式呢?(自我归纳)
两个生成式都是起到简化代码的作用,而且是简化很多;当我们在已有列表或字典的基础上想要生成新的列表时
1.列表生成式
1.1单循环列表生成式
例1:生成列表元素分别为[11 22 33…99]
import math
li = []
for i in range(1, 10):
li.append(i ** i)
print(li)
print([i ** i for i in range(1, 10)])
print([i ** i for i in range(1, 10) if i % 2 == 0])
1.2 单循环判断列表生成式
例2:找出1~10之间的所有偶数
print([i for i in range(1, 11) if i % 2 == 0])
1.3 双重循环列表生成式
例3: S1=‘ABC’ S2=‘123’ A1 A2 A3. 将s1与s2排列组合.
print([i + j for i in 'ABC' for j in '123'])
1.4 函数返回列表生成式
例4:找出1~10之间的所有偶数.并且返回一个列表(包含以这个偶数为半径的园的面积)
import math
# print(math.pi)
# for r in range(2, 11, 2):
# square = math.pi * r * r
# li.append(square)
# print(li)
print([math.pi * r * r for r in range(2, 11, 2)])
def square(r):
res = math.pi * r * r
return res
print([square(i) for i in range(2,11,2)])
例5:找出1~100之间的所有素数(函数+列表生成式)
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)])
例6:列表的字符串的大写改成小写,不是字符串的去掉
li = ['hello','Wrold',16,17,18,12.3,False,'Apple']
ss=[s for s in li if isinstance(s,str)]
l=[]
for j in ss:
l.append(j.upper())
else:
print(l)
例7:找出/var/log目录中,所有以.log结尾的文件名或者目录名
import os
print(os.listdir('/var/log'))
print([filename for filename in os.listdir('/var/log') if filename.endswith('.log')])
例8:有一个整数列表(10个元素),要求调整元素的顺序
把奇数放在前面 偶数放在后面
import random
li=[random.randint(1,50)for i in range(15)]
print(li)
l=sorted(li,key=lambda x:3 if x%2==0 else 2)
print(l)
例9:(2018-腾讯-在线编程题)
- 题目描述:
给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。输
入值小于1000。
如,输入为10, 程序应该输出结果为2。(共有两对质数的和为10,分别为(5,5),(3,7))
- 输入描述:
输入包括一个整数n,(3 ≤ n < 1000)
- 输出描述:
输出对数
- 示例1 :
输入:
10
输出:
2
num = int(input(‘N:’))
#1.判断2~num之间有多个少质数
def isprime(num):
for i in range(2,num):
if num % i == 0:
return False
else:
return True
primeli = [i for i in range(2,1000) if isprime(i)]
# 判断素数列表中有多少个素数等于num
primepaircount = 0
"""
1.先从列表中拿出两个数
2.判断两个数之和是否等于num
"""
for item1 in primeli:
for item2 in primeli:
if item1 + item2 ==num and item1 <= item2:
primepaircount += 1
print(primepaircount)
[2,3,5,7] 2== 10-2 3==10-3 5 ==10-5 7 ==10-7
for item1 in primeli:
if (num - item1) in primeli and item1 <= num -item1:
primepaircount += 1
print(primepaircount)
2.字典生成式
例1:假设有20个学生,学生的分数在60~100之间,筛选出成绩在90
分以上的学生
import random
student={}
for i in range(20):
student['westos'+str(i)]=random.randint(60,100)
print(student)
print({ j:v for j,v in student.items() if v>90})
例2:将所有的key值都变成大写
d=dict(a=1,b=2)
new={}
for i in d:
new[i.upper()]=d[i]
print(new)
print({i.upper():d[i] for i in d })
例3:大小写的key值合并,统一以小写输出
dd=dict(a=1,b=3,A=2,B=2)
newdd={}
for i in dd:
if i.lower() in newdd:
newdd[i.lower()]+=dd[i]
else:
newdd[i.lower()]=dd[i]
print(newdd)
print({ i.lower():dd.get(i.upper(),0)+dd.get(i.lower(),0 ) for i in dd })