中国大学MOOC实用Python程序设计学习笔记和课后测试6-7周(北京大学)

前情提要:

中国大学MOOC实用Python程序设计学习笔记和课后测试1-3周(北京大学)

中国大学MOOC实用Python程序设计学习笔记和课后测试4-5周(北京大学)

第6周 列表

对列表来说,a+=b 和 a=a+b不同
在这里插入图片描述

列表应用例题:校门外的树

在这里插入图片描述
输入
第一行有两个整数L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表
马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行
每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终
止点的坐标。
输出
包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。
在这里插入图片描述
注意点:
列表存放标记,1或0表示

方法1:简单粗暴

#方法1:
s=input().split()
L,M=int(s[0]),int(s[1])
#列表good存放标记
#good[i] 为True表示坐标i的树还在
good=[True]*(L+1)
for i in range(M):
    start,end=map(int,input().split())
    for k in range(start,end+1):
        # 坐标k处的树被移走了
        good[k]=False
print(sum(good))#记得使用求和函数

方法2:列表的朴素排序算法:选择排序

如果有N个元素需要排序,那么首先从N个元素中找到最小的那个放在下标
0处 (可以通过让它和原来的下标为0的元素交换位置来实现),然后再从剩下
的N-1个元素中找到最小的放在下标1处,然后再从剩下的N-2个元素中找到最
小的放在下标2处……直到剩下最后2个元素中最小的被放在了下标n-2处,所
有的元素即都就位。

#举例:
def SelectionSort(a):
    n=len(a)
    # 每次从a[i]及其右边的元素里选出最小的,放在a[i]这个位置
    for i in range(n-1):
        for j in range(i+1,n): #依次考察a[i]右边元素
            if a[j]<a[i]:
                a[i],a[j]=a[j],a[i]
lst=[1,12,4,56,6,2]
SelectionSort(lst)
print(lst)#[1, 2, 4, 6, 12, 56]

用缺省的比较规则排序,按照顺序排序

在这里插入图片描述
在这里插入图片描述

自定义比较规则的排序

在这里插入图片描述

#自定义比较规则的排序
#自定义关键字函数 key
def myKey(x): #关键字函数
    return x % 10
a = [25,7,16,33,4,1,2]
a.sort(key=myKey)
print(a)# [1, 2, 33, 4, 25, 16, 7] 按个位数排序
# key是函数,sort按对每个元素调用该函数的返回值从小到大排序

print(sorted("This is a test string from Andrew".split(), key=str.lower))
#['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']

在这里插入图片描述
在这里插入图片描述

#用不同关键字排序
students = [
('John', 'A', 15), # 姓名,成绩,年龄
('Mike', 'B', 12),
('Mike', 'C', 18),
('Bom', 'D', 10)]
students.sort(key=lambda x:x[2])
print(students)#按年龄排序

多级排序
在这里插入图片描述

#多级排序
def f(x):
    return (-x[2],x[1],x[0])
students = [('John', 'A', 15), 
            ('Mike', 'C', 19),
            ('Wang', 'B', 12), 
            ('Mike', 'B', 12),
            ('Mike', 'C', 12),
            ('Mike', 'C', 18),
            ('Bom', 'D', 10)]
students.sort(key = f ) #先按年龄从高到低,再按成绩从高到低,再按姓名字典序
print(students)

Python元组的排序

在这里插入图片描述

#元组不能修改,因此无sort函数,可以用sorted得到新的排序后的列表
def f(x):
    return (-x[2],x[1],x[0])
students = (('John', 'A', 15), ('Mike', 'C', 19),
('Wang', 'B', 12), ('Mike', 'B', 12),
('Mike', 'C', 12),('Mike', 'C', 18),
('Bom', 'D', 10)) #students是元组
print(sorted(students,key = f)) #sorted的结果是列表

列表相关函数

在这里插入图片描述

列表映射

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

列表过滤

在这里插入图片描述

列表生成式

在这里插入图片描述
在这里插入图片描述

二维列表

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二维元组

在这里插入图片描述

列表拷贝

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

列表转换

在这里插入图片描述
在这里插入图片描述

课后测试题

提交答案合格
在这里插入图片描述

041:成绩排序

在这里插入图片描述

注意点

掌握列表的关键字排序方法,理解题目给定的排序规则

n=int(input())
list=[]
for i in range(n):
    s=input().split()
    name,grade=s[0],int(s[1])
    list.append((name,grade))
list.sort(key=lambda x:(-x[1],x[0]))
for i in list:
    print(i[0],i[1])

042:图像模糊处理

在这里插入图片描述

注意点

列表的拷贝(深拷贝)
二维列表
最后别忘了循环空串

#042图像模糊处理
import copy
n,m=map(int,input().split())
a=[]
for i in range(n):
    lst=list(map(int,input().split()))
    a.append(lst)
b=copy.deepcopy(a)
for i in range(1,n-1):
    for j in range(1,m-1):
        b[i][j]=round((a[i][j]+a[i-1][j]+a[i+1][j]+a[i][j-1]+a[i][j+1])/5)
for i in range(n):
    for j in range(m):
        print(b[i][j],end=" ")
    print("")

043:向量点积计算

在这里插入图片描述

注意点

构造二维列表,相应相乘求和。map函数的强制转换。

#043向量点积计算
#列表的便捷
n=int(input())
a=list(map(int,input().split()))
b=list(map(int,input().split()))
s=0
for i in range(n):
    s+=a[i]*b[i]
print(s)

044:病人排队

在这里插入图片描述

注意点

每个病人处理成一个元组。写个比较的key函数,返回元组,确保老年人的返回值一定小于非老年人的返回值

def Key_num(x):
    if x[1]>=60:
        return -x[1]
    else:
        return -1
n=int(input())
s=[]
for i in range(n):
    s0=input().split()
    a,b=s0[0],int(s0[1])
    s.append((a,b))
s.sort(key=Key_num)
#print(s)
for i in s:
    print(i[0])

045矩阵乘法

在这里插入图片描述

注意点

数学知识线性代数的应用。注意最后的换行。

n,m,k=map(int,input().split())
A,B,C=[],[],[]
for i in range(n):
    A.append(list(map(int, input().split())))
for i in range(m):
    B.append(list(map(int, input().split())))
# print(A)
# print(B)
#根据线性代数知识,两个矩阵相乘,A矩阵每一行分别乘以B矩阵每一列,求和为C矩阵第一行,然后依次进行。
for i in range(n):
    D=[]
    for j in range(k):
        S = 0
        for d in range(m):
            S+=A[i][d]*B[d][j]
        D.append(S)
    C.append(D)
for i in range(n):
    for j in range(k):
        print(C[i][j],end=" ")
    print("\n",end="")

046:回文字串

在这里插入图片描述

注意点

枚举所有子串的起点和终点,看子串是不是回文串。
把每个回文子串记录成一个元组(长度,起点,子串本身),放到列表里面去排序

s=input()
ch=[]
for i in range(len(s)):
    for j in range(i,len(s)):
        if s[i:j+1]==s[i:j+1][::-1] and len(s[i:j+1])>1:
            ch.append(s[i:j+1])
            #print(ch)
ch.sort(key=lambda x:len(x))
for i in ch:
    print(i)

第7周 字典与集合

字典

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

例题 统计单词频率

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

dt = {}
while True:
    try:
        wd = input()
        if wd in dt: #如果有元素键为wd
            dt[wd] += 1
        else:
            dt[wd] = 1 #加入键为wd的元素,其值是1
    except:
        break #输入结束后的input()引发异常,跳到这里,再跳出循环
result = []
for x in dt.items():
    result.append(x) #x是个元组,x[0]是单词,x[1]是出现次数
result.sort(key = lambda x:(-x[1],x[0]))
for x in result:
    print(x[1],x[0])

集合

在这里插入图片描述
集合四则运算

集合例题

在这里插入图片描述
集合比列表快很多!

words = set([])
while True:
	try:
		wd = input()
		if not wd in words:
			words.add(wd)
	except:
		break
print(len(words))
时间复杂度

在这里插入图片描述

课后测试题

提交答案合格
在这里插入图片描述

047 P园食宿预订系统

在这里插入图片描述

注意点
  1. 建一个字典,元素键是菜名,值是个列表,里面放价格和还剩余的份数
  2. 每读入一个学生点的菜,就到字典里面去查这个菜剩的份数是否>0,如果是,就将其份数减1,然后加其价格到总收入上
#047 p园食宿预订系统
#代表有n个学生订餐,共有m个可选的菜
n,m=map(int,input().split())
#初设空字典存放数据
reverse={}
sum_money=0

#下面m行,每行三个元素,分别是菜名、售价和可提供量,保证菜名不重合,菜价为整数
for i in range(m):
    order_m = input().split()  # 空格分隔
    #每次输入一个人的订单order,把order[0](菜名)作为新字典的键,order[1]售价与order[2]可提供量作为字典的值。
    reverse[order_m[0]]=[int(order_m[1]),int(order_m[2])]
#可以打印看一下是否存入字典
#print(reverse)
#下面n行,每行三个元素,表示这个学生点的三个菜的菜名
for i in range(n):
    #每个学生点三个菜
    order_n=input().split()#空格分隔
    for order in order_n:
        if reverse[order][1] != 0:
            sum_money += reverse[order][0]
            reverse[order][1] -= 1
print(sum_money)
  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值