前情提要:
中国大学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园食宿预订系统
注意点
- 建一个字典,元素键是菜名,值是个列表,里面放价格和还剩余的份数
- 每读入一个学生点的菜,就到字典里面去查这个菜剩的份数是否>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)