“python:字典的练习”解析

第一题

题目:

  1. (程序题)
    班级考试成绩如下:Result = {‘Tony’:69, ‘Tom’:64, ‘Rain’:93, ‘Jack’:61}
    输出全班最高分的人名和他的分数。
    提示:最后结果需要print出来

正确答案:

程序语言 Python 3.x

1
2
3
4
5
6
7
Result =  {'Tony':69, 'Tom':64, 'Rain':93, 'Jack':61}

Result_list= list(Result.items())

Result_list.sort(key=lambda x:x[1],reverse=True)

print(Result_list[0])

解题分析

为了找到最高分的学生,我们可以利用Python中max函数结合字典的get方法,这是一种简洁且高效的方法。

  1. 使用max函数
    max函数用于找出可迭代对象中的最大值。在这里,我们传递了字典Result的键(即学生姓名)作为max函数的第一个参数,并通过key=Result.get指定了比较的依据是字典的值(即分数)。

  2. Result.get方法
    Result.get(key, default=None)方法用于获取字典中指定键的值。如果不提供default参数,当键不存在时,会返回None。在这里,key参数由max函数在内部迭代字典的键时提供。

  3. 打印结果
    使用f-string(格式化字符串字面量)来格式化输出,将最高分的学生姓名和分数嵌入到字符串中并打印。

代码实现

1
2
3
4
5
Result = {'Tony': 69, 'Tom': 64, 'Rain': 93, 'Jack': 61}

student = max(Result, key=Result.get)

print(f"全班最高分是:{student}, 他的分数是:{Result[student]}")

“另一种解法”

另一种方法是将字典转换为列表,然后排序,最后取出最高分的记录。这种方法虽然稍显冗长,但同样有效。

  1. 转换为列表
    使用list(Result.items())将字典转换为包含键值对元组的列表。

  2. 排序
    使用sort方法对列表进行排序。key=lambda x: x[1]指定了排序的依据是元组的第二个元素(即分数),reverse=True表示降序排序,这样最高分会排在最前面。

  3. 打印结果
    直接打印排序后的列表的第一个元素,即最高分的记录。

1
2
3
4
5
6
Result = {'Tony': 69, 'Tom': 64, 'Rain': 93, 'Jack': 61}

Result_list = list(Result.items())
Result_list.sort(key=lambda x: x[1], reverse=True)

print(Result_list[0]) # 输出为 ('Rain', 93)

若需要按题目要求格式打印,可以进一步处理:

1
print(f"全班最高分是:{Result_list[0][0]}, 他的分数是:{Result_list[0][1]}")

第二题

题目:

  1. (程序题)
    描述
    编程模板中给出了一个字符串,其中包含了含有重复的人名,请直接输出出现最多的人名。
    输入输出示例
    这里是个示例,展示输出格式,不是结果。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
s = '''双儿 洪七公 赵敏 赵敏 逍遥子 鳌拜 殷天正 金轮法王 乔峰 杨过 洪七公 郭靖 

杨逍 鳌拜 殷天正 段誉 杨逍 慕容复 阿紫 慕容复 郭芙 乔峰 令狐冲 郭芙

金轮法王 小龙女 杨过 慕容复 梅超风 李莫愁 洪七公 张无忌 梅超风 杨逍

鳌拜 岳不群 黄药师 黄蓉 段誉 金轮法王 忽必烈 忽必烈 张三丰 乔峰 乔峰

阿紫 乔峰 金轮法王 袁冠南 张无忌 郭襄 黄蓉 李莫愁 赵敏 赵敏 郭芙 张三丰

乔峰 赵敏 梅超风 双儿 鳌拜 陈家洛 袁冠南 郭芙 郭芙 杨逍 赵敏 金轮法王

忽必烈 慕容复 张三丰 赵敏 杨逍 令狐冲 黄药师 袁冠南 杨逍 完颜洪烈 殷天正

李莫愁 阿紫 逍遥子 乔峰 逍遥子 完颜洪烈 郭芙 杨逍 张无忌 杨过 慕容复

逍遥子 虚竹 双儿 乔峰 郭芙 黄蓉 李莫愁 陈家洛 杨过 忽必烈 鳌拜 王语嫣

洪七公 韦小宝 阿朱 梅超风 段誉 岳灵珊 完颜洪烈 乔峰 段誉 杨过 杨过 慕容复

黄蓉 杨过 阿紫 杨逍 张三丰 张三丰 赵敏 张三丰 杨逍 黄蓉 金轮法王 郭襄

张三丰 令狐冲 赵敏 郭芙 韦小宝 黄药师 阿紫 韦小宝 金轮法王 杨逍 令狐冲 阿紫

洪七公 袁冠南 双儿 郭靖 鳌拜 谢逊 阿紫 郭襄 梅超风 张无忌 段誉 忽必烈

完颜洪烈 双儿 逍遥子 谢逊 完颜洪烈 殷天正 金轮法王 张三丰 双儿 郭襄 阿朱

郭襄 双儿 李莫愁 郭襄 忽必烈 金轮法王 张无忌 鳌拜 忽必烈 郭襄 令狐冲

谢逊 梅超风 殷天正 段誉 袁冠南 张三丰 王语嫣 阿紫 谢逊 杨过 郭靖 黄蓉

双儿 灭绝师太 段誉 张无忌 陈家洛 黄蓉 鳌拜 黄药师 逍遥子 忽必烈 赵敏

逍遥子 完颜洪烈 金轮法王 双儿 鳌拜 洪七公 郭芙 郭襄 赵敏'''

正确答案:

程序语言 Python 3.x

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
s = '''双儿 洪七公 赵敏 赵敏 逍遥子 鳌拜 殷天正 金轮法王 乔峰 杨过 洪七公 郭靖 



杨逍 鳌拜 殷天正 段誉 杨逍 慕容复 阿紫 慕容复 郭芙 乔峰 令狐冲 郭芙



金轮法王 小龙女 杨过 慕容复 梅超风 李莫愁 洪七公 张无忌 梅超风 杨逍



鳌拜 岳不群 黄药师 黄蓉 段誉 金轮法王 忽必烈 忽必烈 张三丰 乔峰 乔峰



阿紫 乔峰 金轮法王 袁冠南 张无忌 郭襄 黄蓉 李莫愁 赵敏 赵敏 郭芙 张三丰



乔峰 赵敏 梅超风 双儿 鳌拜 陈家洛 袁冠南 郭芙 郭芙 杨逍 赵敏 金轮法王



忽必烈 慕容复 张三丰 赵敏 杨逍 令狐冲 黄药师 袁冠南 杨逍 完颜洪烈 殷天正



李莫愁 阿紫 逍遥子 乔峰 逍遥子 完颜洪烈 郭芙 杨逍 张无忌 杨过 慕容复



逍遥子 虚竹 双儿 乔峰 郭芙 黄蓉 李莫愁 陈家洛 杨过 忽必烈 鳌拜 王语嫣



洪七公 韦小宝 阿朱 梅超风 段誉 岳灵珊 完颜洪烈 乔峰 段誉 杨过 杨过 慕容复



黄蓉 杨过 阿紫 杨逍 张三丰 张三丰 赵敏 张三丰 杨逍 黄蓉 金轮法王 郭襄



张三丰 令狐冲 赵敏 郭芙 韦小宝 黄药师 阿紫 韦小宝 金轮法王 杨逍 令狐冲 阿紫



洪七公 袁冠南 双儿 郭靖 鳌拜 谢逊 阿紫 郭襄 梅超风 张无忌 段誉 忽必烈



完颜洪烈 双儿 逍遥子 谢逊 完颜洪烈 殷天正 金轮法王 张三丰 双儿 郭襄 阿朱



郭襄 双儿 李莫愁 郭襄 忽必烈 金轮法王 张无忌 鳌拜 忽必烈 郭襄 令狐冲



谢逊 梅超风 殷天正 段誉 袁冠南 张三丰 王语嫣 阿紫 谢逊 杨过 郭靖 黄蓉



双儿 灭绝师太 段誉 张无忌 陈家洛 黄蓉 鳌拜 黄药师 逍遥子 忽必烈 赵敏



逍遥子 完颜洪烈 金轮法王 双儿 鳌拜 洪七公 郭芙 郭襄 赵敏'''

ls = s.split()

d = {}

max_name, max_cnt = "", 0

for i in ls:

d[i] = d.get(i, 0) + 1

for k in d:

if d[k] > max_cnt:

max_name, max_cnt = k, d[k]

print(max_name)

解题分析

  1. 输入字符串
    通过input函数接收一个字符串输入(虽然题目已经给出了字符串,但这里为了通用性,保留了输入步骤)。

  2. 分割字符串
    使用split()方法将字符串分割成一个包含所有人名的列表。

  3. 统计人名出现次数
    创建一个空字典,遍历列表,对每个人名进行计数。如果人名已经在字典中,则将其对应的值加1;如果不在,则将其添加到字典中,并将值设为1。

  4. 找出出现次数最多的人名
    使用max()函数和字典的get方法找出字典中值最大的键,即出现次数最多的人名。

  5. 输出结果
    使用print函数输出出现次数最多的人名。

代码实现

1
2
3
4
5
6
7
8
9
10
s = input("请输入字符串,以空格作为间隔:")  # 实际上题目已经给出了字符串,这里为了演示保留输入步骤
ns = s.split()
c = {}
for n in ns:
if n in c:
c[n] += 1
else:
c[n] = 1
m = max(c, key=c.get)
print(f"出现最多的人名是:{m}")

“另一种解法”

另一种解法在统计人名出现次数的同时,试图通过内部循环实时更新最大值,这是不必要的,也是低效的。正确且高效的方法应如上所示,先统计后查找最大值。但为了展示这种方法的思路,这里简要说明:

1
2
3
4
5
6
7
8
9
10
11
s = '...'  # 示例字符串
ls = s.split()
d = {}
max_name, max_cnt = "", 0
for i in ls:
d[i] = d.get(i, 0) + 1
# 不必要的内部循环,仅用于说明思路
for k in d:
if d[k] > max_cnt:
max_name, max_cnt = k, d[k]
print(max_name)

注意:上述内部循环是不必要的,它会导致算法效率降低。正确的做法是在统计完成后,使用一次max()函数即可找到最大值。

第三题

题目:

  1. (程序题)
    键盘输入小明学习的课程名称及考分等信息,信息间采用空格分隔,每个课程用逗号分割,空行回车结束录入,示例格式如下:

数学 90,语文 95,英语 86,物理 84,生物 87

屏幕输出得分最高的课程以及成绩,得分最低的课程及成绩,以及平均分(保留2位小数)。

注意,其中逗号为英文逗号,格式如下;

最高分课程是语文95, 最低分课程是物理84, 平均分是88.40

正确答案:

程序语言 Python 3.x

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
data = input()

txt = data.split(",")

d={ item.split()[0]:item.split()[1] for item in txt}

ls = list(d.items())

ls.sort(key=lambda x: x[1], reverse=True)

s1, g1 = ls[0]

s2, g2 = ls[len(ls) - 1]

mysum = 0



for i in d.values():

mysum +=int(i)

avg = mysum/len(ls)



print("最高分课程是{}{}, 最低分课程是{}{}, 平均分是{:.2f}".format(s1, g1, s2, g2, avg))

解题分析

  1. 初始化空字典
    创建一个空字典,用于存储课程名称和对应分数。

  2. 接收用户输入
    通过input()函数接收用户按格式输入的课程及分数信息。

  3. 分割字符串
    使用split(',')方法将输入的字符串按逗号分割成多个子字符串,每个子字符串包含一门课程的名称和分数。

  4. 遍历子字符串
    对于每个子字符串,使用split()方法进一步分割成课程名称和分数,并将它们存储到字典中。

  5. 查找最高分和最低分
    使用max()min()函数分别找出字典中分数最高和最低的课程名称。

  6. 计算平均分
    通过sum(s.values())计算所有分数的总和,然后除以课程数量得到平均分。

  7. 输出结果
    使用print()函数按指定格式输出最高分课程、最低分课程以及平均分。

代码实现

1
2
3
4
5
6
7
8
9
10
s = {}
ins = input("请按格式输入:")
ps = ins.split(',')
for p in ps:
t, e = p.split()
s[t] = int(e)
mt = max(s, key=s.get)
nt = min(s, key=s.get)
ac = sum(s.values()) / len(s)
print(f"最高分课程是 {mt} {s[mt]},最低分课程是 {nt} {s[nt]},平均分是 {ac:.2f}")

注意:在格式化输出时,确保课程名称与分数之间有空格分隔,以符合题目要求。此外,程序未进行额外的错误处理,若用户输入格式不正确,可能会抛出异常。在实际应用中,应考虑添加输入验证和错误处理机制。

另一种解法

另一种解法是将字典转换为列表,排序后提取最高分和最低分的课程。这种方法虽然提供了另一种处理字典数据的思路,但在本题中并非最高效的方法。不过,为了展示这种方法的思路,这里简要说明:

1
2
3
4
5
6
7
8
9
10
11
12
data = input()
txt = data.split(",")
d = {item.split()[0]: item.split()[1] for item in txt}
ls = list(d.items())
ls.sort(key=lambda x: x[1], reverse=True)
s1, g1 = ls[0]
s2, g2 = ls[len(ls) - 1]
mysum = 0
for i in d.values():
mysum += int(i)
avg = mysum / len(ls)
print("最高分课程是{}{}, 最低分课程是{}{}, 平均分是{:.2f}".format(s1, g1, s2, g2, avg))

这种方法同样能正确解决问题,但在处理大量数据时,可能不如直接使用max()min()函数高效。

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2023-2025 John Doe
  • Visitors: | Views:

请我喝杯茶吧~

支付宝
微信