主题色

Python 作业-8 字典集合

程序填空题 / 编程题

程序填空题

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,96 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))
行号代码白话解释
1a = [int(x) for x in input().split(',')]把输入的得票字符串按逗号拆开,每个序号转成整数,存成列表。
2team2 = {6, 7, 8, 9, 10}用集合存放第二小队全部队员序号,方便后面做"集合减法"。
4voted = set(a)把得票列表转成集合,自动去重,得到所有得过票的序号。
5not_voted = team2 - voted集合减法:在 team2 中但不在 voted 中的元素,就是没得到票的队员。
7print(*sorted(not_voted))把没得票的队员排序后,用 * 展开成多个参数打印,数字之间自动用空格分隔。

6-2 选课学生统计

题目:输入 Python、数学、英语三门课程选课学生的学号,输出三行数据:

  1. 至少选择一门课的学生人数;
  2. 选 Python 但未选英语的学生人数;
  3. 同时选择三门课的学号,按升序排列。
输入样例输出样例
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~3a = set(input().split())每行读入选课学生学号,按空格拆分后用 set() 转成集合。
5all_students = a | b | c| 是集合的并集运算,得到至少选了一门课的所有学生。
6python_not_english = a - c- 是集合差集,得到选了 Python(集合 a)但没选英语(集合 c)的学生。
7three_courses = a & b & c& 是集合交集,得到三门课都选的学生。
9print(len(all_students))输出至少选一门课的学生总人数。
10print(len(python_not_english))输出选 Python 但未选英语的学生人数。
11print(*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)))
行号代码白话解释
1n = int(input())读取随机数的个数 n(这行读完即可,后面具体数字用另一行读取)。
2nums = input().split()读取第二行的所有数字字符串,按空格拆成列表。
4unique_nums = set()准备一个空集合,用来存放不重复的数字。
5~6for x in nums: unique_nums.add(int(x))逐个把字符串转成整数,放进集合;集合会自动去掉重复值。
8sorted_nums = sorted(unique_nums)sorted() 把集合元素从小到大排序,返回一个新列表。
9print(len(sorted_nums))输出不重复数字的个数。
10print(' '.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)
行号代码白话解释
1d = eval(input())把输入的字符串直接当成 Python 表达式执行,得到字典对象。
3new_d = {}准备一个空字典,用来存键值对换后的结果。
4~5for key, value in d.items()遍历原字典的每一对键值;原来的键变成值,原来的值变成键。
7print(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('登录失败')
行号代码白话解释
1dic = {...}预先定义好用户名和密码的对应关系。
3for i in range(3):最多给用户 3 次尝试机会。
4~5name = input(); pwd = input()每次循环读取用户名和密码,各占一行。
6dic.get(name) == pwdget() 查询用户名对应的密码;如果存在且等于输入的密码,则登录成功。
7~8print('登录成功'); break成功后输出并立即结束循环,不再询问。
9~10else: 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~2d1 = eval(input()); d2 = eval(input())读取两个班级的投票字典。
4result = {}准备一个空字典,存放合并后的结果。
5~6for key in d1: result[key] = d1[key]先把 1 班的所有节目和票数放进结果字典。
7~10for key in d2: ...再处理 2 班:如果节目已经在结果中,就加上票数;否则新增这个节目。
12for key in sorted(result):把合并后的节目编号按字母顺序排序后遍历。
13print(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 eatapple: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}')
行号代码白话解释
1words = input().split()读取一行英文单词,按空格拆成列表。
3count = {}准备一个空字典,键是单词,值是出现次数。
4~7for word in words: ...遍历每个单词;如果已经在字典中,次数加 1,否则设为 1。
9items = list(count.items())把字典的键值对转成列表,方便排序。
10items.sort(key=lambda x: (-x[1], x[0]))按"次数降序、次数相同则单词升序"排序。-x[1] 让次数多的排在前面。
12~13for 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])
行号代码白话解释
1n = int(input())读取病人总人数。
3~6patients = [] ... append((pid, int(age), i))逐个读取病人 ID 和年龄,同时把登记顺序 i 也存进元组,方便后面按"先来后到"排序。
8~12elderly = []; young = []把病人分成两组:60 岁及以上的放 elderly,其余放 young。
14elderly.sort(key=lambda x: (-x[1], x[2]))老年人先按年龄降序,年龄相同则按登记顺序升序。
15young.sort(key=lambda x: x[2])非老年人只按登记顺序升序排列。
17~18for p in elderly + young: print(p[0])把老年人排在前面、非老年人接在后面,依次输出每个人的 ID。