python练习五——PTA
Posted ~晚风微凉~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python练习五——PTA相关的知识,希望对你有一定的参考价值。
7-1 图的字典表示 (20 分)
捕获.JPG
图的字典表示。输入多行字符串,每行表示一个顶点和该顶点相连的边及长度,输出顶点数,边数,边的总长度。比如上图0点表示:
{‘O’:{‘A’:2,‘B’:5,‘C’:4}}。用eval函数处理输入,eval函数具体用法见第六章内置函数。
输入格式:
第一行表示输入的行数 下面每行输入表示一个顶点和该顶点相连的边及长度的字符串
输出格式:
在一行中输出顶点数,边数,边的总长度
输入样例:
在这里给出一组输入。例如:
4
{‘a’:{‘b’:10,‘c’:6}}
{‘b’:{‘c’:2,‘d’:7}}
{‘c’:{‘d’:10}}
{‘d’:{}}
结尾无空行
输出样例:
在这里给出相应的输出。例如:
4 5 35
结尾无空行
#又是去括号?
n=int(input())
nn=n
bian=0
length=0
while n>=1:
# print("gkhk")
n-=1
tmp=eval(input())
# print(tmp.values())
for i in tmp.values():#tmp.value()厉害诶,这个居然能把输入的字典里的字典都给提取出来了
""" kk={}
kk=i
print(kk)"""
if isinstance(i, dict):
# print("1111")
bian += len(i)
# print(bian)
for value in i.values():
length += value
# print(length)
print("{} {} {}".format(nn,bian,length))
7-2 四则运算(用字典实现) (30 分)
四则运算(用字典实现),比较c语言的switch语句。
输入格式:
在一行中输入一个数字 在一行中输入一个四帜运算符(+,-,*,/) 在一行中输入一个数字
输出格式:
在一行中输出运算结果(小数保留2位)
输入样例1:
在这里给出一组输入。例如:
7
/
3
结尾无空行
输出样例1:
在这里给出相应的输出。例如:
2.33
结尾无空行
输入样例2:
在这里给出一组输入。例如:
10
/
0
结尾无空行
输出样例2:
在这里给出相应的输出。例如:
divided by zero
结尾无空行
#这个怎么用字典运算啊?之后想想
m=float(input())
c=input()
n=float(input())
if c=="/":
if n!=0:
ans=m/n
else:
print("divided by zero")
exit(0)
elif c=="*":
ans=m*n
elif c=="+":
ans=m+n
elif c=="-":
ans=m-n
print("%.2f" %ans)#format还是有点不熟悉
7-3 通过两个列表构建字典 (10 分)
输入两行字符串,以空格为分隔,将每行字符串存储为列表形式。将第一个列表的元素值作为键,将第二个列表中对应顺序的元素作为值,构建一个字典,按键升序排列后输出字典的所有键值对列表。
输入格式:
输入两行字符串,分别以空格为分隔存为列表。
输出格式:
按键的升序,输出字典键值对列表。
输入样例:
学校 城市 邮编
集美大学 厦门 361021
结尾无空行
输出样例:
[(‘城市’, ‘厦门’), (‘学校’, ‘集美大学’), (‘邮编’, ‘361021’)]
结尾无空行
#有连续的时间写题的感觉真好
m=map(str,input().split())
n=map(str,input().split())
m=list(m)
n=list(n)
'''for i in range(0,len(m)):
ans.clear()
ans.append(m[i])
ans.append(n[i])
tmp=tuple(ans)
end.append(tmp)
print(end)
#[('城市', '厦门'), ('学校', '集美大学'), ('邮编', '361021')]'''
tmp1={}
for i in range(0,len(m)):
tmp1[m[i]]=n[i]
end=[]
tmp=[]
for i in sorted(tmp1):
tmp.clear()
tmp.append(i)
tmp.append(tmp1[i])
end.append(tuple(tmp))
print(end)#nice成功用到了题目 要求的字典,之后的题目做对后,都试试用题目要求的数据结构
7-4 两数之和 (30 分)
给定一组整数,还有一个目标数,在给定这组整数中找到两个数字,使其和为目标数,如找到,解是唯一的。找不到则显示 “no answer”。输出的下标按从小到大排序。用一重循环加字典实现。
输入格式:
在一行中给出这组数。 在下一行输入目标数
输出格式:
在一行中输出这两个数的下标,用一个空格分开。
输入样例1:
在这里给出一组输入。例如:
2,7,11,15
9
结尾无空行
输出样例1:
在这里给出相应的输出。例如:
0 1
结尾无空行
输入样例2:
在这里给出一组输入。例如:
3,6,9
10
结尾无空行
输出样例2:
在这里给出相应的输出。例如:
no answer
结尾无空行
#这个怎么也用字典
n=map(int,input().split(','))
n=list(n)
m=int(input())
# print(n)
for i in range(0,len(n)):
for j in range(i+1,len(n)):
if n[i]+n[j]==m:
print("%d %d" %(i,j))
exit(0)
print("no answer")
7-5 输出星期名缩写 (70 分)
输入一个1到7的数字,输出对应的星期名的缩写。
1 Mon
2 Tue
3 Wed
4 Thu
5 Fri
6 Sat
7 Sun
输入格式:
输入1到7之间数字
输出格式:
输出对应的星期名的缩写
输入样例:
在这里给出一组输入。例如:
1
结尾无空行
输出样例:
在这里给出相应的输出。例如:
Mon
结尾无空行
m={}
m[1]="Mon"
m[2]="Tue"
m[3]="Wed"
m[4]="Thu"
m[5]="Fri"
m[6]="Sat"
m[7]="Sun"
n=int(input())
print(m[n])
7-6 jmu-python-查成绩 (10 分)
从键盘输入一个学生所有课程的成绩,输入格式为”课程名:成绩“,每门课占一行,以空行结束。随后提示”请输入要查询的课程:“,用户从键盘输入课程名,查询并输出该课程的成绩,要求进行异常处理,对不存在的课程进行捕捉处理。
输入格式:
输入学生所有课程的成绩,每门课占一行,格式为”课程名:成绩“,以空行结束 在提示后输入课程名
输出格式:
如果课程存在,直接输出成绩,否则提示”没有该门课程“
输入样例1:
数学:96
英语:82
计算机:76
思政:90
计算机
结尾无空行
输出样例1:
请输入要查询的课程:
76
结尾无空行
输入样例2:
数学:96
英语:82
计算机:76
思政:90
数学a
结尾无空行
输出样例2:
请输入要查询的课程:
没有该门课程
结尾无空行
#以空行为结束符,第一次哦
zd={}
while True:
try:
tmp0=input().split(':')
# print(tmp0)
if len(tmp0)==1:
# print("kongge ")
break
tmp1=int(tmp0[1])
tmp0=tmp0[0]
zd[tmp0]=tmp1
# print(zd)
except:break
requ=input()
print("请输入要查询的课程:")
try:
print(zd[requ])
except:
print("没有该门课程")
7-7 jmu-python-重复元素判定 (20 分)
每一个列表中只要有一个元素出现两次,那么该列表即被判定为包含重复元素。
编写函数判定列表中是否包含重复元素,如果包含返回True,否则返回False。
然后使用该函数对n行字符串进行处理。最后统计包含重复元素的行数与不包含重复元素的行数。
输入格式:
输入n,代表接下来要输入n行字符串。
然后输入n行字符串,字符串之间的元素以空格相分隔。
输出格式:
True=包含重复元素的行数, False=不包含重复元素的行数
,后面有空格。
输入样例:
5
1 2 3 4 5
1 3 2 5 4
1 2 3 6 1
1 2 3 2 1
1 1 1 1 1
结尾无空行
输出样例:
True=3, False=2
结尾无空行
n=int(input())
true=0
flase=0
for i in range(0,n):
m=map(int,input().split())
m=list(m)
"""sign=100
for i in range(0,n):
for j in range(i+1,n):
if m[i]==m[j]:
true+=1
sign=99
break
if sign==99:
break"""
#想到了新的方法,nice
if(len(m)!=len(set(m))):#出现了重复元素
true+=1
false=n-true
print("True=%d, False=%d" %(true,false))
7-8 jmu-python-生日悖论 (15 分)
生日悖论,指如果一个房间里有23个或23个以上的人,那么至少有两个人的生日相同的概率要大于50%。尝试编程验证。
验证方法提示:使用从1到365的整数代表生日。测试n次,每次生成23个随机数,随机数的范围从1到365(包括365)。
然后查看有无重复的生日。
最后算出重复的比率。
输入格式:
随机数种子x 测试次数n
注意:需将x转换为整数型再进行设置。
输出格式:
rate=算出的比率,比率保留2位小数
输入样例:
3 1000
输出样例:
rate=0.54
#又是这随机数种子啊,之前就见到过但是用的少,没怎么记住
import random as r
x,n=input().split()
#1000次的实验结果取平均值吗,重复是在一次测试里重复取值吗
num=0;
n=int(n)
tmp=[]
ans=0
r.seed(int(x))
while True:
#python里的表达式都返回什么值啊,为什么不能像c++一样
if(num>n):
break
num+=1
tmp.clear()
for i in range(23):#生成23个人的生日
tmp.append(r.randint(1,365))
if(len(tmp)!=len(set(tmp))):#出现同一天生日的
ans+=1
ans=ans/n
print("rate={:.2f}".format(ans))
#终于把题目看明白了,相当于就是用计算机来实现概率统计和概率定值
7-9 统计并输出字符串中小写元音字母的个数 (30 分)
输入一个以换行结束的字符串,统计并输出字符串中小写元音字母的个数(小写元音字母: ‘a’,‘e’,‘i’,‘o’,‘u’)。
输入格式:
在一行中输入字符串
输出格式:
在一行中输出字符串中小写元音字母的个数
输入样例:
在这里给出一组输入。例如:
HelloI
结尾无空行
输出样例:
在这里给出相应的输出。例如:
2
结尾无空行
s=input()
p=[]
p.append('a')
p.append('e')
p.append('i')
p.append('o')
p.append('u')
# print(p)
ans=0
for i in range(0,len(s)):
if s[i] in p:
ans+=1
print(ans)
7-10 分析活动投票情况 (20 分)
利用集合分析活动投票情况。第一小队有五名队员,序号是1,2,3,4,5;第二小队也有五名队员,序号6,7,8,9,10。输入一个得票字符串,求第二小队没有得票的队员
输入格式:
在一行中输入得票的队员的序列号,用逗号隔开。
输出格式:
一行中输出第二小队没有得票的队员序号。
输入样例:
在这里给出一组输入。例如:
1,5,9,3,9,1,1,7,5,7,7,3,3,1,5,7,4,4,5,4,9,5,10,9
结尾无空行
输出样例:
在这里给出相应的输出。例如:
6 8
结尾无空行
m=map(int,input().split(','))
m=list(m)
zd={}
for i in range(0,len(m)):
zd[m[i]]=1
num=0
for i in range(5,11):
try:
if zd[i]==1:
continue
except:
num+=1
if num==1:
print("%d" %i,end="")
elif num>1:
print(" %d" %i,end="")
7-11 能被3,5和7整除的数的个数(用集合实现) (30 分)
求指定区间内能被3,5和7整除的数的个数
输入格式:
在一行中从键盘输入2个正整数a,b(1<=a<b<=10000000),用空格隔开。
输出格式:
在一行输出大于等于a且小于等于b的能被3,5和7整除的数的个数。
输入样例1:
在这里给出一组输入。例如:
10 100
结尾无空行
输出样例1:
在这里给出相应的输出。例如:
0
结尾无空行
输入样例2:
在这里给出一组输入。例如:
1000 100000
结尾无空行
输出样例:
在这里给出相应的输出。例如:
943
结尾无空行
#这个为什么要用集合啊,不是没有重复的吗
a,b=map(int,input().split())
ans=0
for i in range(a,b+1):
if i%3==0 and i%5==0 and i%7==0:
ans+=1
print(ans)
7-12 求矩阵鞍点的个数 (30 分)
一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。
本题要求编写程序,求一个给定的n阶方阵的鞍点。
输入格式: 输入第一行给出一个正整数n(1≤n≤6)。随后n行,每行给出n个整数,其间以空格分隔。
输出格式: 鞍点的个数
输入样例1:
4
1 7 4 1
4 8 3 6
1 6 1 2
0 7 8 9
结尾无空行
输出样例1:
1
结尾无空行
输入样例2:
2
1 7
4 1
结尾无空行
输出样例2:
0
结尾无空行
输入样例3:
3
4 7 8
1 3 3
2 3 1
结尾无空行
输出样例3:
2
结尾无空行
#按行按列分别存为列表好查找最大最小
#或者直接找到每行每列的最大值最小值存起来,但是思路好复杂,有没有简便的方法,感觉有好多循环
#算了,看别人的代码也好多,还是自己写吧
#弄个二维数组存放每一行列的最大最小值 ,字典,列表也行,第一个用作行列数标记
n=int(input())
#所有的存进字典,int 列表
mp={}#hang
mp1={}#lie
ans1={}#hangmax
ans2={}#liemin
for i in range(1,n+1):
tmp=list(map(int,input().split()))
mp[i]=tmp
# print(mp[i])
ans1[i]=max(tmp)
tmp=[]
for i in range(n):
tmp.clear()
for j in range(1,n+1):
# print(mp[j][i])
tmp.append(mp[j][i])
# mp1[i]=tmp
ans2[i]=min(tmp)
# print(mp1[i],ans2[i])
end1=0
for i in range(1,n+1):
for j in range(n):
if ans1[i]==ans2[j]:
end1+=1
# print(end)
print(end1)#感觉我的算法还是存在漏洞,不能保证是行列相同,放ACM过不了
7-13 列表或元组的数字元素求和 (20 分)
求列表中数字和,列表中嵌套层次不限2层
输入格式:
在一行中输入列表或元组
输出格式:
在一行中输出数字的和
输入样例:
在这里给出一组输入。例如:
[11,2,[3,7],(68,-1),“123”,9]
结尾无空行
输出样例:
在这里给出相应的输出。例如:
99
结尾无空行
"""#这个题之前也出现过,但是当时不敢写,这几天的数据结构里如果是括号匹配用c++,可以考虑用栈
str=map(str,input().split(','))
#原来列表里的数字字符是不算的,那就考虑列表的操作
str=list(str)
print(str)"""
def solve(str):
ans=0;
for i in str:
if isinstance(i,int):
ans+=i
elif isinstance(i,list):
ans+=solve(i)
elif isinstance(i,tuple):
ans+=solve(i)
# print(ans)
return ans
str=eval(input())#为什么一定要eval啊连带着列表这个性质也赌进去了,不然就是字符串
# str=input()
print(solve(str))
7-14 列表数字元素加权和(1) (40 分)
输入一个嵌套列表,嵌套层次不限,根据层次,求列表元素的加权和。第一层每个元素 的值为:元素值1,第二层每个元素的值为:元素值2,第三层每个元素的值为:元素值*3, …,以此类推!
输入格式:
在一行中输入列表
输出格式:
在一行中输出加权和
输入样例:
在这里给出一组输入。例如:
[1,2,[3,4,[5,6],7],8]
结尾无空行
输出样例:
在这里给出相应的输出。例如:
72
结尾无空行
s=eval(input())
def f(basic, num):
if type(basic) == int:
return basic*num
else:
return sum(f(i, num+1) for i in basic)
print(f(s, 0))
7-15 jmu-Java&Python-统计一段文字中的单词个数并按单词的字母顺序排序后输出 (10 分)
现需要统计若干段文字(英文)中的不同单词数量。
如果不同的单词数量不超过10个,则将所有单词输出(按字母顺序),否则输出前10个单词。
注1:单词之间以空格(1个或多个空格)为间隔。
注2:忽略空行或者空格行。
注3:单词大小写敏感,即’word’与’WORD’是两个不同的单词 。
输入说明
若干行英文,最后以!!!为结束。
输出说明
不同单词数量。 然后输出前10个单词(按字母顺序),如果所有单词不超过10个,则将所有的单词输出。
输入样例
Failure is probably the fortification in your pole
It is like a peek your wallet as the thief when you
are thinking how to spend several hard-won lepta
when you Are wondering whether new money it has laid
background Because of you, then at the heart of the
most lax alert and most low awareness and left it
godsend failed
!!!
输出样例
49
Are
Because
Failure
It
a
alert
and
are
as
at
ans=0
false=[]
tmp=[]
end=[]
while True:
try:
false=input()
if false=='\\n' or false==' ':
continue;
if false=='!!!!!':
# print("结束")
break
tmp=map(str,false.split())#空行怎么办
tmp=list(tmp)
end=end+tmp
except:
break
end=set(end)
print(len(end))
end=sorted(end)
if(len(end)<=10):
for i in end:
print(i)
else:
for i in range(10):
print(end[i])
7-16 jmu-Java&Python-统计文字中的单词数量并按出现次数排序 (25 分)
现在需要统计若干段文字(英文)中的单词数量,并且还需统计每个单词出现的次数。
注1:单词之间以空格(1个或多个空格)为间隔。
注2:忽略空行或者空格行。
基本版:
统计时,区分字母大小写,且不删除指定标点符号。
进阶版:
统计前,需要从文字中删除指定标点符号!.,😗?。 注意:所谓的删除,就是用1个空格替换掉相应字符。
统计单词时需要忽略单词的大小写。
输入说明
若干行英文,最后以!!!为结束。
输出说明
单词数量
出现次数排名前10的单词(次数按照降序排序,如果次数相同,则按照键值的字母升序排序)及出现次数。
输入样例1
failure is probably the fortification in your pole
it is like a peek your wallet as the thief when you
are thinking how to spend several hard-won lepta
when you are wondering whether new money it has laid
background because of you then at the heart of the
most lax alert and most low awareness and left it
godsend failed
!!!
输出样例1
46
the=4
it=3
you=3
and=2
are=2
is=2
most=2
of=2
when=2
your=2
结尾无空行
输入样例2
Failure is probably The fortification in your pole!
It is like a peek your wallet as the thief when You
are thinking how to. spend several hard-won lepta.
when yoU are? wondering whether new money it has laid
background Because of: yOu?, then at the heart of the
Tom say: Who is the best? No one dare to say yes.
most lax alert and! most low awareness and* left it
godsend failed
!!!
结尾无空行
输出样例2
54
the=5
is=3
it=3
you=3
and=2
are=2
most=2
of=2
say=2
to=2
结尾无空行
ans=0
false=[]
tmp=[]
end=[]
kk=[]
kk.append('!')
kk.append('.')
kk.append(',')
kk.append(PTA的Python练习题(二十)