【PTA|Python】浙大版《Python 程序设计》题目集:第六章
前言
Hello!小伙伴!
非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~
自我介绍 ଘ(੭ˊᵕˋ)੭
昵称:海轰
标签:程序猿|C++选手|学生
简介:因C语言结识编程,随后转入计算机专业,有幸拿过国奖、省奖等,已保研。目前正在学习C++/Linux(真的真的太难了~)
学习经验:扎实基础 + 多做笔记 + 多敲代码 + 多思考 + 学好英语!
往期题目集
【PTA|Python】浙大版《Python 程序设计》题目集:第一章
【PTA|Python】浙大版《Python 程序设计》题目集:第二章
【PTA|Python】浙大版《Python 程序设计》题目集:第三章
【PTA|Python】浙大版《Python 程序设计》题目集:第四章
【PTA|Python】浙大版《Python 程序设计》题目集:第五章
第六章
6-1 输入列表,求列表元素和(eval输入应用) (10 分)
题目
在一行中输入列表,输出列表元素的和。
输入格式:
一行中输入列表。
输出格式:
在一行中输出列表元素的和。
输入样例:
[3,8,-5]
输出样例:
6
解答
提交代码 - 1
lst=eval(input())
print(eval('+'.join('%s' %id for id in lst)))
- 1
- 2
提交代码 - 2
print(sum(eval(input())))
- 1
6-2 一帮一 (15 分)
题目
“一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。
本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生的排名后,在当前尚未分组的学生中,将名次最靠前的学生与名次最靠后的异性学生分为一组。
输入格式:
输入第一行给出正偶数N(≤50),即全班学生的人数。此后N行,按照名次从高到低的顺序给出每个学生的性别(0代表女生,1代表男生)和姓名(不超过8个英文字母的非空字符串),其间以1个空格分隔。这里保证本班男女比例是1:1,并且没有并列名次。
输出格式:
每行输出一组两个学生的姓名,其间以1个空格分隔。名次高的学生在前,名次低的学生在后。小组的输出顺序按照前面学生的名次从高到低排列。
输入样例:
8
0 Amy
1 Tom
1 Bill
0 Cindy
0 Maya
1 John
1 Jack
0 Linda
输出样例:
Amy Jack
Tom Linda
Bill Maya
Cindy John
解答
#!/usr/bin/python3
# 存储所有学生的名字 根据名次排序
students = []
# 存储女孩的名字 根据名次排序
girl = []
# 存储男孩的名字 根据名次排序
boy = []
n = int(input())
for i in range(n): student = input().split() students.append(student[1]) if student[0] == '0': boy.append(student[1]) else: girl.append(student[1])
# 遍历前4名
for i in range(n//2): # 如果是男孩 if students[i] in boy: # 找到该孩子在男孩中的名次 与index对应 比如在第1名index为0 # 男孩中的第一个应该与女孩中的最后一个组合 # 所以 男孩的索引为index 那么女孩的索引就是-1-index # -1表示最后一个 再-index表示往前几个 # 例如:-1-1 表示再最后一个的基础上再前进2个元素 index = boy.index(students[i]) print("{} {}".format(students[i], girl[-1-index])) else: index = girl.index(students[i]) print("{} {}".format(students[i], boy[-1-index]))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
6-3 列表或元组的数字元素求和 (20 分)
题目
求列表中数字和,列表中嵌套层次不限2层
输入格式:
在一行中输入列表或元组
输出格式:
在一行中输出数字的和
输入样例:
在这里给出一组输入。例如:
[11,2,[3,7],(68,-1),“123”,9]
输出样例:
在这里给出相应的输出。例如:
99
解答
注意题目中只需要求的是数字和
例子:[11,2,[3,7],(68,-1),“123”,9] 中“123”属于字符串,不再计算范围内
正确计算是:11+2+3+7+68+(-1)+9=99
编写代码时注意不要将字符串也纳入计算范围内了,注意提取正确的数字,避开字符串(开始还没有注意到)
#!/usr/bin/python3
s = input()
# s为字符串
# 首先将[]()替换
s = s.replace('[', '')
s = s.replace(']', '')
s = s.replace('(', '')
s = s.replace(')', '')
# 注意”123“属于字符串 不属于数字 我们是不需要的
s2 = ""
# 记录”的个数
count = 0
# 遍历s
# 统计“的个数 如果为偶数且不为” 说明为数字
for i in s: if i == '"': count += 1 if count % 2 == 0 and i != '"': s2 += i
# 替换逗号
s2 = s2.replace(',', ' ')
# 注意可能两个数中间原来有两个逗号 替换后就有两个空格
# 再利用split() 提取元素 转化为list类型
s2 = s2.split()
ans = 0
# 遍历s2 list类型
for i in s2: ans += int(i)
print(ans)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
6-4 列表数字元素加权和(1) (40 分)
题目
输入一个嵌套列表,嵌套层次不限,根据层次,求列表元素的加权和。第一层每个元素 的值为:元素值1,第二层每个元素的值为:元素值2,第三层每个元素的值为:元素值*3, …,以此类推!
输入格式:
在一行中输入列表
输出格式:
在一行中输出加权和
输入样例:
在这里给出一组输入。例如:
[1,2,[3,4,[5,6],7],8]
输出样例:
在这里给出相应的输出。例如:
72
解答
有几个需要注意的地方:
- 其中的数字可以为两位数、三位数
- 数字也可以为负数
提供的一些测试数据
- [1]
- [-1]
- [1,[19,1],2]
- …
踩坑:如果开始以字符串读取,再逐一读取字符,需要注意每次读取只得到一个字符。比如字符串“234”,读取是2、3、4 这个地方易错
# 以字符串类型读入数据
s = input()
# count:统计[、]字符的个数 遇到[ +1 遇到] -1
count = 0
# ans:最后结果
ans = 0
# 字符串索引
index = 0
# 判断一个数是负数还是正数
flag = 1
# 遍历字符串
while index < len(s): # 遇到[ 层级+1 if s[index] == '[': count += 1 # 遇到] 层级-1 elif s[index] == ']': count -= 1 # 遇到 '-' 说明之后的数字为负数 elif s[index] == '-': flag = -1 # 如果是一个数字 则需要判断后面是否接着为数字 # 如果是 还得拼接数字 比如23 # 因为是逐个字符读取 # 每次只读一个字符 # 读到2时 还需要判断后面是否还是数字 # 如果是 需要拼接为23 elif s[index].isdigit(): index2 = index num = 0 while s[index2].isdigit(): num = num*10+int(s[index2]) index2 += 1 # 更新index index = index2-1 # 更新ans 注意正负号 ans = ans+count*num*flag # 最后需要将flag再次设置为1 flag = 1 index += 1
print(ans)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
6-5 列表元素个数的加权和(1) (40 分)
题目
输入一个嵌套列表,嵌套层次不限,根据层次,求列表元素的加权个数和。第一层每个元素算一个元素,第二层每个元素算2个元素,第三层每个元素算3个元素,第四层每个元素算4个元素,…,以此类推!
输入格式:
在一行中输入一个列表。
输出格式:
在一行中输出加权元素个数值。
输入样例:
在这里给出一组输入。例如:
[1,2,[3,4,[5,6],7],8]
输出样例:
在这里给出相应的输出。例如:
15
解答
在上一题思路上简化即可
s = input()
count = 0
ans = 0
index = 0
while index < len(s): if s[index] == '[': count += 1 elif s[index] == ']': count -= 1
# elif s[index]=='-':
# flag=-1 elif s[index].isdigit(): index2 = index while s[index2].isdigit(): index2 += 1 index = index2-1 ans = ans+count index += 1
print(ans)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
第6章-6 求指定层的元素个数 (40 分)
题目
输入一个嵌套列表,再输入层数,求该层的数字元素个数。
输入格式:
第一行输入列表 第二行输入层数
输出格式:
在一行中输出元素个数
输入样例:
在这里给出一组输入。例如:
[1,2,[3,4,[5,6],7],8] 3
输出样例:
在这里给出相应的输出。例如:
2
解答
s = input()
n=int(input())
count = 0
ans = {}
index = 0
while index < len(s): if s[index] == '[': count += 1 elif s[index] == ']': count -= 1 elif s[index].isdigit(): index2 = index while s[index2].isdigit(): index2 += 1 index = index2-1 ans[count]=ans.get(count,0)+1 index += 1
print(ans[n])
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
6-7 找出总分最高的学生 (15 分)
题目
给定N个学生的基本信息,包括学号(由5个数字组成的字符串)、姓名(长度小于10的不包含空白字符的非空字符串)和3门课程的成绩([0,100]区间内的整数),要求输出总分最高学生的姓名、学号和总分。
输入格式:
输入在一行中给出正整数N(≤10)。随后N行,每行给出一位学生的信息,格式为“学号 姓名 成绩1 成绩2 成绩3”,中间以空格分隔。
输出格式:
在一行中输出总分最高学生的姓名、学号和总分,间隔一个空格。题目保证这样的学生是唯一的。
输入样例:
5
00001 huanglan 78 83 75
00002 wanghai 76 80 77
00003 shenqiang 87 83 76
10001 zhangfeng 92 88 78
21987 zhangmeng 80 82 75
输出样例:
zhangfeng 10001 258
解答
n = int(input())
maxSumGrades = 0
maxSumGradesIndex = 0
students = []
for i in range(n): student = list(input().split()) sumGrades = 0 for j in range(2, 5): sumGrades += int(student[j]) if sumGrades > maxSumGrades: maxSumGrades = sumGrades maxSumGradesIndex = i students.append(student)
print("{} {} {}".format(students[maxSumGradesIndex][1], students[maxSumGradesIndex][0], maxSumGrades))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
6-8 输出全排列 (20 分)
题目
输入整数n(3<=n<=7),编写程序输出1,2,…,n整数的全排列,按字典序输出。
输入格式:
一行输入正整数n。
输出格式:
按字典序输出1到n的全排列。每种排列占一行,数字间无空格。
输入样例:
在这里给出一组输入。例如:
3
输出样例:
在这里给出相应的输出。例如:
123
132
213
231
312
321
解答
1-n的全排列(3<=n<=7)
最小数一定是:123…45…n
最大数是:n…54…321
思路(暴力循环):
- 从123…n 到 n…321 依次遍历
- 对其进行set操作
- 当set(num)==set(“123…n”)时
- 说明是符合条件的全排列
n = int(input())
ls = [str(i) for i in range(1, n+1)]
s = "1234567"
# beg=123...n
beg = int(s[:n])
# end=n...321
end = int(s[n-1::-1])
for x in range(beg, end+1): if set(str(x)) == set(ls): print(x)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
结语
文章仅作为学习笔记,记录从0到1的一个过程
希望对您有所帮助,如有错误欢迎小伙伴指正~
我是 海轰ଘ(੭ˊᵕˋ)੭
如果您觉得写得可以的话,请点个赞吧
谢谢支持 ❤️
文章来源: haihong.blog.csdn.net,作者:海轰Pro,版权归原作者所有,如需转载,请联系作者。
原文链接:haihong.blog.csdn.net/article/details/119063937
- 点赞
- 收藏
- 关注作者
评论(0)