【PTA|Python】浙大版《Python 程序设计》题目集:第六章

举报
海轰Pro 发表于 2021/08/06 00:44:14 2021/08/06
【摘要】 前言 Hello!小伙伴! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~   自我介绍 ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计算机专业,有幸拿过国奖、省奖等,已保研。目前正在学习C++/Linux(真的真的太难了~) 学习经验:扎实基础 + 多做笔记 + 多敲代码 + 多思考 +...

前言

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

image.png
提交代码 - 2

print(sum(eval(input())))

  
 
  • 1

image.png

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

image.png

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

image.png

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

image.png

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

image.png

第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

image.png

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

image.png

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

image.png

结语

文章仅作为学习笔记,记录从0到1的一个过程

希望对您有所帮助,如有错误欢迎小伙伴指正~

我是 海轰ଘ(੭ˊᵕˋ)੭

如果您觉得写得可以的话,请点个赞吧

谢谢支持 ❤️

在这里插入图片描述

文章来源: haihong.blog.csdn.net,作者:海轰Pro,版权归原作者所有,如需转载,请联系作者。

原文链接:haihong.blog.csdn.net/article/details/119063937

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。