程序填空题
6-1 第二小队没有得票的队员
题目:第一小队有五名队员,序号是 1、2、3、4、5;第二小队也有五名队员,序号是 6、7、8、9、10。输入一个得票字符串,求第二小队中没有得票的队员序号。
| 输入样例 | 输出样例 |
1,5,9,3,9,1,1,7,5,7,7,3,3,1,5,7,4,4,5,4,9,5,10,9 | 6 8 |
a = [int(x) for x in input().split(',')]
team2 = {6, 7, 8, 9, 10}
voted = set(a)
not_voted = team2 - voted
print(*sorted(not_voted))
| 行号 | 代码 | 白话解释 |
| 1 | a = [int(x) for x in input().split(',')] | 把输入的得票字符串按逗号拆开,每个序号转成整数,存成列表。 |
| 2 | team2 = {6, 7, 8, 9, 10} | 用集合存放第二小队全部队员序号,方便后面做"集合减法"。 |
| 4 | voted = set(a) | 把得票列表转成集合,自动去重,得到所有得过票的序号。 |
| 5 | not_voted = team2 - voted | 集合减法:在 team2 中但不在 voted 中的元素,就是没得到票的队员。 |
| 7 | print(*sorted(not_voted)) | 把没得票的队员排序后,用 * 展开成多个参数打印,数字之间自动用空格分隔。 |
6-2 选课学生统计
题目:输入 Python、数学、英语三门课程选课学生的学号,输出三行数据:
- 至少选择一门课的学生人数;
- 选 Python 但未选英语的学生人数;
- 同时选择三门课的学号,按升序排列。
| 输入样例 | 输出样例 |
12035411 12035302 12034509 12035318 12035308 12031102 12031111
12035421 12035312 12034509 12035318 12035328 12031101 12031111
12035121 12035322 12034509 12035317 12035338 12031101 12031102 12031111 | 15
4
12031111 12034509 |
a = set(input().split())
b = set(input().split())
c = set(input().split())
all_students = a | b | c
python_not_english = a - c
three_courses = a & b & c
print(len(all_students))
print(len(python_not_english))
print(*sorted(three_courses))
| 行号 | 代码 | 白话解释 |
| 1~3 | a = set(input().split()) | 每行读入选课学生学号,按空格拆分后用 set() 转成集合。 |
| 5 | all_students = a | b | c | | 是集合的并集运算,得到至少选了一门课的所有学生。 |
| 6 | python_not_english = a - c | - 是集合差集,得到选了 Python(集合 a)但没选英语(集合 c)的学生。 |
| 7 | three_courses = a & b & c | & 是集合交集,得到三门课都选的学生。 |
| 9 | print(len(all_students)) | 输出至少选一门课的学生总人数。 |
| 10 | print(len(python_not_english)) | 输出选 Python 但未选英语的学生人数。 |
| 11 | print(*sorted(three_courses)) | 把三门课都选的学生学号排序后展开打印。 |
编程题
7-1 明明的随机数
题目:明明想请一些同学做问卷调查。为了客观,他先用计算机生成若干整数,其中重复的数字只保留一个,不同的数字对应不同学生的学号。然后再把这些数从小到大排序,按顺序去找同学。请你协助明明完成"去重"与"排序"的工作。
| 输入样例 | 输出样例 |
10
20 40 32 67 40 20 89 300 400 15 | 8
15 20 32 40 67 89 300 400 |
n = int(input())
nums = input().split()
unique_nums = set()
for x in nums:
unique_nums.add(int(x))
sorted_nums = sorted(unique_nums)
print(len(sorted_nums))
print(' '.join(map(str, sorted_nums)))
| 行号 | 代码 | 白话解释 |
| 1 | n = int(input()) | 读取随机数的个数 n(这行读完即可,后面具体数字用另一行读取)。 |
| 2 | nums = input().split() | 读取第二行的所有数字字符串,按空格拆成列表。 |
| 4 | unique_nums = set() | 准备一个空集合,用来存放不重复的数字。 |
| 5~6 | for x in nums: unique_nums.add(int(x)) | 逐个把字符串转成整数,放进集合;集合会自动去掉重复值。 |
| 8 | sorted_nums = sorted(unique_nums) | 用 sorted() 把集合元素从小到大排序,返回一个新列表。 |
| 9 | print(len(sorted_nums)) | 输出不重复数字的个数。 |
| 10 | print(' '.join(map(str, sorted_nums))) | 把排序后的整数再转回字符串,用空格连接后输出。 |
7-2 字典输入输出
题目:从键盘输入一个字典,将该字典的键和值对换后输出。
| 输入样例 | 输出样例 |
{1:'a',2:'b',3:'c'} | {'a': 1, 'b': 2, 'c': 3} |
d = eval(input())
new_d = {}
for key, value in d.items():
new_d[value] = key
print(new_d)
| 行号 | 代码 | 白话解释 |
| 1 | d = eval(input()) | 把输入的字符串直接当成 Python 表达式执行,得到字典对象。 |
| 3 | new_d = {} | 准备一个空字典,用来存键值对换后的结果。 |
| 4~5 | for key, value in d.items() | 遍历原字典的每一对键值;原来的键变成值,原来的值变成键。 |
| 7 | print(new_d) | 输出对换后的新字典。 |
7-3 字典应用:用户登录
题目:已知用户名字典 dic = {'admin':'123456', 'administrator':'12345678', 'root':'password'}。实现用户输入用户名和密码,当用户名与密码和字典中的键值对匹配时显示"登录成功",否则显示"登录失败"。登录失败时允许重复输入三次。
| 输入样例 | 输出样例 |
admin
12345678
admin
123456 | 登录失败
登录成功 |
dic = {'admin':'123456', 'administrator':'12345678', 'root':'password'}
for i in range(3):
name = input()
pwd = input()
if dic.get(name) == pwd:
print('登录成功')
break
else:
print('登录失败')
| 行号 | 代码 | 白话解释 |
| 1 | dic = {...} | 预先定义好用户名和密码的对应关系。 |
| 3 | for i in range(3): | 最多给用户 3 次尝试机会。 |
| 4~5 | name = input(); pwd = input() | 每次循环读取用户名和密码,各占一行。 |
| 6 | dic.get(name) == pwd | 用 get() 查询用户名对应的密码;如果存在且等于输入的密码,则登录成功。 |
| 7~8 | print('登录成功'); break | 成功后输出并立即结束循环,不再询问。 |
| 9~10 | else: print('登录失败') | 密码不匹配时提示失败,继续下一次循环。 |
7-4 分班统计最喜欢的节目
题目:学校举办迎新晚会,1 班和 2 班各自统计了班里同学最喜欢的节目。节目编号由一个大写字母代表,统计结果分别存放到两个字典中,键是节目编号,值是相应节目获得的票数。输入两个班级的统计结果,将合并后的统计结果按节目编号的字母顺序打印出来。注意:如果两个班都喜欢同一个节目,票数要相加。
| 输入样例 | 输出样例 |
{'Q':10,'A':22,'X':28}
{'A':30,'D':1,'Q':15,'B':13} | A:52
B:13
D:1
Q:25
X:28 |
d1 = eval(input())
d2 = eval(input())
result = {}
for key in d1:
result[key] = d1[key]
for key in d2:
if key in result:
result[key] = result[key] + d2[key]
else:
result[key] = d2[key]
for key in sorted(result):
print(f'{key}:{result[key]}')
| 行号 | 代码 | 白话解释 |
| 1~2 | d1 = eval(input()); d2 = eval(input()) | 读取两个班级的投票字典。 |
| 4 | result = {} | 准备一个空字典,存放合并后的结果。 |
| 5~6 | for key in d1: result[key] = d1[key] | 先把 1 班的所有节目和票数放进结果字典。 |
| 7~10 | for key in d2: ... | 再处理 2 班:如果节目已经在结果中,就加上票数;否则新增这个节目。 |
| 12 | for key in sorted(result): | 把合并后的节目编号按字母顺序排序后遍历。 |
| 13 | print(f'{key}:{result[key]}') | 按"节目编号:统计票数"的格式逐行输出。 |
7-5 单词统计并按顺序打印
题目:输入一些英文单词,统计每个单词出现的次数(大小写敏感,如 'At' 和 'at' 算不同的单词),并按次数从多到少打印结果;如果次数相同,按单词的字典顺序打印(大写先于小写)。
| 输入样例 | 输出样例 |
apple round apple red apple juicy apple sweet apple apple I love you apple sweet I love to eat | apple:7
I:2
love:2
sweet:2
eat:1
juicy:1
red:1
round:1
to:1
you:1 |
words = input().split()
count = {}
for word in words:
if word in count:
count[word] = count[word] + 1
else:
count[word] = 1
items = list(count.items())
items.sort(key=lambda x: (-x[1], x[0]))
for word, num in items:
print(f'{word}:{num}')
| 行号 | 代码 | 白话解释 |
| 1 | words = input().split() | 读取一行英文单词,按空格拆成列表。 |
| 3 | count = {} | 准备一个空字典,键是单词,值是出现次数。 |
| 4~7 | for word in words: ... | 遍历每个单词;如果已经在字典中,次数加 1,否则设为 1。 |
| 9 | items = list(count.items()) | 把字典的键值对转成列表,方便排序。 |
| 10 | items.sort(key=lambda x: (-x[1], x[0])) | 按"次数降序、次数相同则单词升序"排序。-x[1] 让次数多的排在前面。 |
| 12~13 | for word, num in items: print(...) | 按排序后的顺序逐行输出"单词:次数"。 |
7-6 病人排队
题目:病人登记看病,按以下原则排出看病顺序:
- 老年人(年龄 ≥ 60 岁)比非老年人优先看病;
- 老年人按年龄从大到小排序,年龄相同的按登记先后顺序排序;
- 非老年人按登记先后顺序看病。
| 输入样例 | 输出样例 |
5
021075 40
004003 15
010158 67
021033 75
102012 30 | 021033
010158
021075
004003
102012 |
n = int(input())
patients = []
for i in range(n):
pid, age = input().split()
patients.append((pid, int(age), i))
elderly = []
young = []
for p in patients:
if p[1] >= 60:
elderly.append(p)
else:
young.append(p)
elderly.sort(key=lambda x: (-x[1], x[2]))
young.sort(key=lambda x: x[2])
for p in elderly + young:
print(p[0])
| 行号 | 代码 | 白话解释 |
| 1 | n = int(input()) | 读取病人总人数。 |
| 3~6 | patients = [] ... append((pid, int(age), i)) | 逐个读取病人 ID 和年龄,同时把登记顺序 i 也存进元组,方便后面按"先来后到"排序。 |
| 8~12 | elderly = []; young = [] | 把病人分成两组:60 岁及以上的放 elderly,其余放 young。 |
| 14 | elderly.sort(key=lambda x: (-x[1], x[2])) | 老年人先按年龄降序,年龄相同则按登记顺序升序。 |
| 15 | young.sort(key=lambda x: x[2]) | 非老年人只按登记顺序升序排列。 |
| 17~18 | for p in elderly + young: print(p[0]) | 把老年人排在前面、非老年人接在后面,依次输出每个人的 ID。 |