主题色

Python 作业-7 列表

程序填空题 / 编程题

程序填空题

5-1 列表统计练习

已知包含四个整数的列表对象 v,根据注释的要求完成程序填空。

输入样例输出样例
(无,直接运行)21
7
52
13.00
v = [7, 11, 13, 21]
print(max(v))
print(min(v))
print(sum(v))
print("{:.2f}".format(sum(v)/len(v)))
行号代码白话解释
2max(v)max() 返回列表中最大元素,输出 21
3min(v)min() 返回列表中最小元素,输出 7
4sum(v)sum() 求所有元素之和,7+11+13+21=52。
5sum(v)/len(v)总和除以元素个数得到均值,再格式化为 2 位小数。

5-2 列表元素的增删与访问

假设有列表 mylist=["张红","女","计算机"],编写程序按顺序进行以下操作:

  1. 输入学号插入在专业后;
  2. 按顺序输入年月日(以逗号间隔),添加在性别后;
  3. 输入三个整数,按顺序分别代表高数、英语和体育成绩,以逗号间隔,添加在列表末尾,成为列表的三个元素;
  4. 删除性别;

假设今年是 2023 年,按输出样例格式输出张红的姓名、性别、年龄、学号及体育成绩等信息。

程序输入程序输出
1001
[2001,9,30]
[90,82,76]
张红:性别女、今年22岁、学号1001、体育76分。
mylist = ["张红", "女", "计算机"]
num = input()
mylist.insert(2, num)
ymd = eval(input())
mylist.insert(2, ymd)
courses = eval(input())
mylist.extend(courses)
sex = mylist.pop(1)
print("{}:性别{}、今年{}岁、学号{}、体育{}分。".format(
    mylist[0], sex, 2023 - mylist[2][0], mylist[3], mylist[-1]))
行号代码白话解释
3mylist.insert(2, num)在索引 2("计算机" 前面)插入学号。
5mylist.insert(2, ymd)在索引 2 插入年月日列表,此时位于 "女" 之后。
7mylist.extend(courses)将三门成绩列表的元素逐个追加到末尾。
8mylist.pop(1)删除并返回索引 1 的元素("女"),保存到 sex
102023 - mylist[2][0]mylist[2] 是 [2001,9,30],取第 0 项算年龄。
10mylist[-1]列表最后一个元素是体育成绩。

5-3 最长单词

以下程序用于实现:输入一句英文句子,求其中最长的单词及其长度。

提示:先将英文句子中的单词分离出来存入列表后处理。注意句子末尾的句号不算在最后一个单词的长度内。

输入样例输出样例
Chinese Museums Association Committee of Museums along the Silk Road.最长单词是Association,长度是11。
s = input()
words = s.strip('.').split()
lt = [len(word) for word in words]
maxlen = max(lt)
maxword = words[lt.index(maxlen)]
print("最长单词是{},长度是{}。".format(maxword, maxlen))
行号代码白话解释
2s.strip('.').split()先去掉末尾句号,再用空格分割成单词列表。
3[len(word) for word in words]列表推导式,生成每个单词长度的列表。
4max(lt)找出长度列表中的最大值。
5words[lt.index(maxlen)]index 找到最大长度在 lt 中的位置,再到 words 中取对应单词。

编程题

7-1 计算裁判平均分

体育比赛中,评委会给参赛选手打分。选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分,编写程序计算并输出某选手的得分。

输入样例输出样例
98 99 97 9597.50
scores = list(map(int, input().split()))
scores.sort()
avg = sum(scores[1:-1]) / (len(scores) - 2)
print("{:.2f}".format(avg))
行号代码白话解释
1list(map(int, input().split()))读入一行字符串,按空格分割,每个元素转 int,再转成列表。
2scores.sort()原地排序,最小值在开头,最大值在末尾。
3scores[1:-1]切片去掉第一个(最低分)和最后一个(最高分)。
3len(scores) - 2剩余评委人数。
4"{:.2f}".format(avg)保留 2 位小数输出。

7-2 sdut-期末考试之排名次

期末考试结束了,童鞋们的成绩也出来了,可是为了排名次可忙坏了老师,因为学生太多了。这时,老师把这个任务交给了你,希望你能帮老师完成。作为 IT 人,你当然不能用笨笨的人工方法了,编程解决才是好办法。

共有三门课,语文、数学和英语,要求根据学生的各科成绩计算出其总成绩,并根据总成绩从高到低排序。

输入样例输出样例
3
70 80 90
59 59 59
100 100 100
300
240
177
n = int(input())
totals = []
for _ in range(n):
    c, m, e = map(int, input().split())
    totals.append(c + m + e)
totals.sort(reverse=True)
for t in totals:
    print(t)
行号代码白话解释
1int(input())读入学生人数 N。
4map(int, input().split())每行读入三个整数。
5totals.append(c + m + e)计算总成绩并加入列表。
6sort(reverse=True)降序排列,大的在前。
7for t in totals:依次输出排序后的总成绩。

7-3 最小值归零

输入若干个正整数(至少一个),输出每个数减去最小值的结果。

输入样例输出样例
4 5 67 3 99 2 72 3 65 1 97 0 5
nums = list(map(int, input().split()))
m = min(nums)
result = [str(x - m) for x in nums]
print(" ".join(result))
行号代码白话解释
1list(map(int, input().split()))读入所有整数到列表。
2min(nums)找出列表中最小值。
3[str(x - m) for x in nums]每个数减最小值,再转成字符串,组成新列表。
4" ".join(result)用空格将字符串列表连接成一行输出。

7-4 哪里贵了

在一次直播销售活动中,消费者在弹幕中提出“这个品牌越来越贵了”时,销售员里加其(Rigachi)回应说:“哪里贵了?”。为了解决这个问题,他决定为那些高价商品打个折:如果一个商品的价格超过了所有商品的平均价格,那么该商品的价格就打 9 折,低于平均价格的商品则维持原价。最后,为了表示诚意,他将所有商品的价格再抹了个零头,全部取整。请你来帮他更新一下所有商品的最终价格。

输入样例输出样例
8
40.3 90.2 74.3 34.4 33.1 32.1 12.6 69.8
40 81 66 34 33 32 12 62
n = int(input())
prices = list(map(float, input().split()))
avg = sum(prices) / n
result = []
for p in prices:
    if p > avg:
        result.append(int(p * 0.9))
    else:
        result.append(int(p))
print(" ".join(map(str, result)))
行号代码白话解释
2list(map(float, input().split()))读入 n 个实数到列表。
3sum(prices) / n计算平均价格。
6int(p * 0.9)超过均价的打 9 折,再取整(抹零)。
8int(p)不超过均价的直接取整。
9" ".join(map(str, result))结果列表转字符串后空格连接输出。

7-5 大笨钟的心情

有网友问:未来还会有更多大笨钟题吗?笨钟回复说:看心情……

本题就请你替大笨钟写一个程序,根据心情自动输出回答。

输入样例输出样例
80 75 60 50 20 20 20 20 55 62 66 51 42 33 47 58 67 52 41 20 35 49 50 63
17
7
3
15
-1
52 Yes
20 No
50 No
58 Yes
mood = list(map(int, input().split()))
while True:
    h = int(input())
    if h < 0 or h > 23:
        break
    if mood[h] > 50:
        print("{} Yes".format(mood[h]))
    else:
        print("{} No".format(mood[h]))
行号代码白话解释
1list(map(int, input().split()))读入 24 个整数,依次对应 0~23 时的心情指数。
3while True:无限循环,直到遇到非法时间。
5h < 0 or h > 23非法时间点(不在 0~23 范围),跳出循环。
6mood[h] > 50查询第 h 小时的心情指数,大于 50 输出 Yes。
8else否则输出 No,格式为 "心情指数 Yes/No"。

7-6 身份证验证码

身份证的最后一位是根据前 17 位数字计算出来的检验码。计算方法是:

  1. 将身份证号码前 17 位数分别乘以不同的系数。从第 1 位到第 17 位的系数分别为:7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2
  2. 将乘积之和除以 11,余数可能为 0~10。则根据余数,分别对应的最后一位身份证号码为:1,0,X,9,8,7,6,5,4,3,2

编写程序,输入身份证号码前 17 位,输出对应的检验码。

输入样例输出样例
34052419800101001X
coef = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]
check = ['1','0','X','9','8','7','6','5','4','3','2']
s = input().strip()
total = 0
for i in range(17):
    total += int(s[i]) * coef[i]
print(check[total % 11])
行号代码白话解释
1coef预定义 17 个权重系数。
2check预定义 11 个余数对应的校验码。
5for i in range(17):遍历前 17 位。
6int(s[i]) * coef[i]每位数字乘以对应系数,累加到总和。
7check[total % 11]总和对 11 取余,作为索引查校验码表。