【PTA|Python】浙大版《Python 程序设计》题目集:第六章
第六章
6-1 输入列表,求列表元素和(eval输入应用) (10 分)
题目
在一行中输入列表,输出列表元素的和。
输入格式:
❝一行中输入列表。
❞
输出格式:
❝在一行中输出列表元素的和。
❞
输入样例:
❝[3,8,-5]
❞
输出样例:
❝6
❞
解答
提交代码 - 1
lst=eval(input())
print(eval('+'.join('%s' %id for id in lst)))
提交代码 - 2
print(sum(eval(input())))
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]))
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)
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)
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)
第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])
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))
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)
结语
文章仅作为学习笔记,记录从0到1的一个过程
希望对您有所帮助,如有错误欢迎小伙伴指正~