python实验课2~5---序列、选择与循环、字符串与正则表达式

实验2:python序列(列表、元组、字典、集合)

第二章习题P66的15、16、18题

  1. 编写程序,生成包含10000~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))
  1. 编写程序,用户输入一个列表和2个整数作为下标,然后输出列表中介于2个下标区间之间的元素组成的子列表。例如用户输入 [1, 2, 3, 4, 5, 6]25,程序输出 [3, 4, 5, 6]
list1 = eval(input('请输入一个列表: '))
a, b = eval(input('请输入两个整数作为下标: '))
print(list1[a:b+1])
  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题

  1. 用筛选法查找并输出小于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()
  1. 设计一个字典,并编写程序,用户输入内容作为键,然后输出字典中对应的值,如果用户输入的键不存在,则输出"您输入的键不存在!"
dic = {'A':'65','B':'66','Y':'89','Z':'90','a':'97','z':'122'}
a = input("请输入键:")
print(dic.get(a,"您输入的键不存在!"))

实验4:选择与循环

P81:3、4、9

  1. 用户输入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));
  1. 生成一个包含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)
  1. 用户从键盘输入小于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))
  1. 实现分段函数的计算
    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

  1. 假设有一段英文,其中有单独的字母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)
  1. 假设有一段英文,其中有单词中间的字母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)
  1. 有一段英文文本,其中有单词连续重复了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)
  1. 编写程序,用户输入一段英文,然后输出这段英文中所有长度为3个字母的单词
import re

s = input("请输入一段英文:")
print(re.findall(r'\b[a-zA-Z]{3}\b',s))
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值