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

Posted 海轰Pro

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)))


提交代码 - 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的一个过程

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

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

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

谢谢支持 ❤️

以上是关于PTA|Python浙大版《Python 程序设计》题目集:第六章的主要内容,如果未能解决你的问题,请参考以下文章

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

PTA|Python浙大版《Python 程序设计》题目集:函数练习

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

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

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

PTA|Python浙大版《Python 程序设计》题目集:第四章(适合Pythno新手的基础练习题集)