实验2:python序列(列表、元组、字典、集合)
第二章习题P66的15、16、18题
- 编写程序,生成包含
1000
个0~100
的随机整数,并统计每个元素的出现次数
# 解法1:用集合实现该功能
import random
list1 = [random.randint(0, 100) for i in range(1000)]
for i in list1:
print(i, ':', list1.count(i))
# 解法2:用字典实现该功能
import random
list1 = [random.randint(0, 100) for i in range(1000)]
d = dict() #定义空字典
for i in list1:
d[i] = d.get(i, 0) + 1 #dict.get(key, 0) 返回指定键的值,如果键不在字典中返回0
print(d)
# 解法3:用collections模块的defaultdict类来实现该功能
from collections import defaultdict
import random
list1 = [random.randint(0, 100) for i in range(1000)]
# 设置defaultdict参数为int,使defaultdict用于计数
list2 = defaultdict(int)
for i in list1:
list2[i] += 1
print(list2)
# 解法4:用collections模块的Counter类来实现该功能
# Counter是一个dict的子类,用于计数可哈希对象
# 它的key为元素,value为它们的计数
from collections import Counter
import random
list1 = [random.randint(0, 100) for i in range(1000)]
print(Counter(list1))
- 编写程序,用户输入一个列表和
2
个整数作为下标,然后输出列表中介于2
个下标区间之间的元素组成的子列表。例如用户输入[1, 2, 3, 4, 5, 6]
和2
,5
,程序输出[3, 4, 5, 6]
list1 = eval(input('请输入一个列表: '))
a, b = eval(input('请输入两个整数作为下标: '))
print(list1[a:b+1])
- 编写程序,生成包含
20
个随机数的列表,然后将前10
个元素升序排列,后10
个元素降序排列,并输出结果。
# 解法1:使用python内置排序函数
import random
list1 = [random.randint(0, 1000000) for i in range(20)]
a = sorted(list1[:10])
b = sorted(list1[10:],reverse=True)
list2 = a + b
print(list2)
# 解法2:使用冒泡排序
# for循环:从第一个元素开始,每次比较两个相邻元素,如果它们的顺序错误,就交换
import random
list1 = [random.randint(0, 1000000) for i in range(20)]
for i in range(10):
for j in range(i, 10):
if list1[i] > list1[j]:
list1[i],list1[j] = list1[j],list1[i]
for i in range(19, 9, -1):
for j in range(i, 9, -1):
if list1[i] > list1[j]:
list1[i],list1[j] = list1[j],list1[i]
print(list1)
# 解法3:使用归并排序
import random
def merge_sort(q):
# 递归终止情况
if(len(q) <= 1): return
# 递归处理子问题
mid = len(q) // 2
l = q[:mid]
r = q[mid:]
merge_sort(l)
merge_sort(r)
# 合并子问题
i, j, k = 0, 0, 0
# 同时遍历两个数组,数字小的加入到数组q中(q中的数是排好序的)
while(i < len(l) and j < len(r)):
if(l[i] <= r[j]):
q[k] = l[i]
i+=1
else:
q[k] = r[j]
j+=1
k+=1
# 扫尾:一个数组遍历结束,另一个数组还没有,把剩下的数组尾部添加到q中
while i < len(l):
q[k] = l[i]
i += 1
k += 1
while j < len(r):
q[k] = r[j]
j += 1
k += 1
list1 = [random.randint(0, 10000000) for i in range(20)]
merge_sort(list1)
print(list1[:10]) # 前10个数升序排列
print(list1[19:9:-1]) # 后10个数降序排列
试验3:python序列(列表、元组、字典、集合)
P66的12、17题
- 用筛选法查找并输出小于
1000
的所有素数
#全局变量N
global N
N = 1001
# 埃氏筛法求素数:从2开始,把每个素数的倍数都标记为合数,以达到筛选素数的目的
def primes1():
num = [1 for i in range(N + 1)] # 前1001个都标记为1,即质数
cnt = 0 # 记录素数的数量cnt
for i in range(2, N+1):
if num[i]:
cnt += 1
else:
continue
# 进行到这步,i一定是质数,将i的倍数标记为合数
for j in range(2*i, N+1, i):
num[j] = False
for i in range(2, N+1):
if num[i]:
print(i)
# 欧拉筛法求素数:
# 算数基本定理:任何一个>=2的自然数N都可以被分解成有限个素数的幂的乘积
# N = p1^a1 * p2^a2 * p3^a3....,这里Pi均为素数(p1<p2<p3...),ai为正整数
# 欧拉筛法就是在埃氏筛法的基础上,让每个合数只被它的最小质因子筛选一次
def primes2():
num = [1 for i in range(N + 1)] #素数标1,合数标0
prime = []
for i in range(2, N+1):
if num[i]: #如果i为素数
prime.append(i) #将i加入到素数列表prime中
#遍历数组prime,这里把prime[j]当作最小质因子,i当作倍数
j = 0
while i * prime[j] <= N:
num[i * prime[j]] = 0
if i % prime[j] == 0:
break
j += 1
print(prime)
if __name__ == '__main__':
primes1()
primes2()
- 设计一个字典,并编写程序,用户输入内容作为键,然后输出字典中对应的值,如果用户输入的键不存在,则输出
"您输入的键不存在!"
dic = {'A':'65','B':'66','Y':'89','Z':'90','a':'97','z':'122'}
a = input("请输入键:")
print(dic.get(a,"您输入的键不存在!"))
实验4:选择与循环
P81:3、4、9
- 用户输入
4
位整数作为年份,判断其是否为闰年
# 方法1:单分支if
x = int(input("请输入年份:"))
if(x % 400 == 0 or (x % 4 == 0 and x % 100)):
print("{}是闰年".format(x))
else:
print("{}不是闰年".format(x))
# 方法2:嵌套if
x = int(input("请输入年份:"))
if(x % 4 == 0):
if(x % 100 == 0):
if(x % 400 == 0):
print("{}是闰年".format(x));
else:
print("{}不是闰年".format(x));
else:
print("{}是闰年".format(x));
else:
print("{}不是闰年".format(x));
# 方法3:调用calendar库中封装的isleap()方法判断是否为闰年
import calendar
x = int(input("请输入年份:"))
isleap = calendar.isleap(x)
if isleap == True:
print("{}是闰年".format(x));
else:
print("{}不是闰年".format(x));
- 生成一个包含
50
个随机整数的列表,然后删除其中所有奇数
import random
list1 = [random.randint(1, 1000) for i in range(50)]
print(list1)
i = len(list1) - 1; #从最后一位开始
while i >= 0:
if list1[i]%2 == 1:
del list1[i]
i -= 1
print(list1)
- 用户从键盘输入小于
1000
的整数,对其进行因式分解(分解质因数)
根据算数基本定理:任何一个>=2
的自然数N
都可以被分解成有限个质数的幂的乘积
N = p1^a1 * p2^a2 * p3^a3....
,这里Pi
均为素数(p1<p2<p3...)
,ai
为正整数
from math import sqrt
x = int(input("请输入一个小于1000的整数:"))
print("{} = ".format(int(x)), end="")
for i in range(2, int(sqrt(x)+1)): # x的质因子中最多一个大于sqrt(n)的质因子
if x % i == 0:
s = 0
while(x % i == 0):
s += 1
x /= i
for j in range(0,s):
print("{}*".format(i), end="")
if x > 1:
print(int(x))
- 实现分段函数的计算
x<0,y=0;0<=x<5,y=x;5<=x<10,y=3x-5;
10<=x<20,y=0.5x-2;x>=20,y = 0;
x = int(input("请输入x的值:"))
if(x < 0):
y = 0
elif(x>=0 and x<5):
y = x
elif(x >= 5 and x < 10):
y = 3*x-5
elif(x >= 10 and x < 20):
y = 0.5*x+2
elif(x >= 20):
y = 0
print("分段函数y的值为:{}".format(y))
实验5:字符串与正则表达式
第四章课后练习 1、2、3、4
- 假设有一段英文,其中有单独的字母
I
误写为i
,请编写程序进行纠正。
样例:i am a teacher, i am man, and i am 38 years old. I am not a business.
# 不使用正则表达式
str = input("请输入一段英文:")
str = str.replace('i','I')
str = str.replace('i','I')
print(str)
# 使用正则表达式
import re
s = input("请输入一段英文:")
s = re.sub(r'\bi\b','I',s)
print(s)
- 假设有一段英文,其中有单词中间的字母
i
误写为I
,请编写程序进行纠正
样例:I am sIx years old. I lIke play the piano. I am a unIversity student. I major in Information management and informatIon system.
import re
s = input("请输入一段英文:")
s = re.sub(r'\BI|I\B','i',s)
print(s)
- 有一段英文文本,其中有单词连续重复了
2
次,编写程序检查重复的单词,并只保留一个。
例如,文本内容为This is is a desk.
,程序输出为This is a dest.
# 字符串split切割,用集合去重,再将列表用join拼接
s = input("请输入一段英文文本:")
l1 = []
for i in s.split(" "):
if i not in l1:
l1.append(i);
res = " ".join(l1)
print(res)
- 编写程序,用户输入一段英文,然后输出这段英文中所有长度为
3
个字母的单词
import re
s = input("请输入一段英文:")
print(re.findall(r'\b[a-zA-Z]{3}\b',s))