文章目录
- 简单应用
- 第一题
- 第二题
- 第三题
- 第四题
- 题型共同特点
- 核心知识点讲解
- 解题通用方法步骤
- 操作的难点
- 1.数据的统计
- 2.数据的筛选
- 1. **条件判断筛选**
- 2. **结合文件操作筛选**
- 3. **多条件组合筛选**
- 类似题目
- 其它一题
简单应用
第一题
题目
在考生文件夹下的PY202.py文件中,编写Python代码实现以下功能:
通过键盘输入某班同学就业的行业名称,行业名称之间用空格间隔,回车结束输入。统计各个行业就业的学生数量,并按照数量从高到低的方式输出,输出格式为 “行业名称:数量”,冒号为英文冒号。
解答
names = input("请输入各个同学行业名称,行业名称之间用空格间隔(回车结束输入):")
t = names.split(" ")
d = {}
for i in range(len(t)):d[t[i]] = d.get(t[i], 0) + 1
ls = list(d.items())
ls.sort(key=lambda x: x[1], reverse=True) # 按照数量排序
for k in ls:# 直接解包 kzy, num = kprint("{}:{}".format(zy, num))
第二题
题目
在考生文件夹下的PY202.py文件中编写代码,实现以下功能:
通过键盘输入小明学习的课程名称及考分信息,信息间用空格分隔,每个课程一行,空行回车结束录入。之后在屏幕输出得分最高的课程及成绩,得分最低的课程及成绩,以及平均分(保留2位小数),输出格式为 “最高分课程是[课程名] [分数],最低分课程是[课程名] [分数],平均分是[平均分]”,其中逗号为英文逗号。
解答
data = input() # 课程名 考分
scores = [] # 用于存储课程名和分数的列表
while data:course, score = data.split() # 拆分输入的课程名和分数scores.append((course, int(score))) # 将课程名和转换为整数的分数存入列表data = input()
# 提取所有分数
all_scores = [s[1] for s in scores]
# 找到最高分和对应的课程
max_course, max_score = max(scores, key=lambda x: x[1])
# 找到最低分和对应的课程
min_course, min_score = min(scores, key=lambda x: x[1])
# 计算平均分
average_score = sum(all_scores) / len(all_scores)
print("最高分课程是{} {}, 最低分课程是{} {}, 平均分是{:.2f}".format(max_course, max_score, min_course, min_score, average_score))
第三题
问题
这是一道Python编程题目,要求使用字典和列表型变量完成村长选举相关功能:
- 从
name.txt
获取40名有选举权和被选举权的村民名单,从vote.txt
获取投票信息。 - 问题1:从
vote.txt
中筛选出无效票(选票中名字数量不为1或者名字不在name.txt
列表中的票),并写入vote1.txt
。 - 问题2:找出当选村长的名字及其得票数。
需要补充考生文件夹下PY202.py
中的代码来完成程序。
解答
f=open("name.txt")
names=f.readlines()
f.close()
f=open("vote.txt")
votes=f.readlines()
f.close()
f=open("vote1.txt","w")
D={}
NUM=0
for vote in votes:num = len(vote.split())if num==1 and vote in names:D[vote[:-1]]=D.get(vote[:-1],0)+1NUM+=1else:f.write(vote)
f.close()
l=list(D.items())
l.sort(key=lambda s:s[1],reverse=True)
name=l[0][0]
score=l[0][1]
print("有效票数为:{} 当选村长村民为:{},票数为:{}".format(NUM,name,score))
第四题
题目
这是一道Python编程题目,要求利用字典和列表变量对明星投票数据进行分析,投票信息在vote.txt
文件中。具体有两个问题:
- 问题1:统计有效票张数,需补充
PY202 - 1.py
中的代码完成程序,分值7分。 - 问题2:给出当选最有人气明星的姓名和票数,需补充
PY202 - 2.py
中的代码完成程序,分值8分。有效票指一行只有一个明星姓名的投票,在有效票中得票最多的明星当选 。
解答
f = open("vote.txt")
names = f.readlines()
f.close()
n = 0
for name in names:num = len(name.split())if num==1:n+=1
print("有效票{}张".format(n))
f = open("vote.txt")
names = f.readlines()
f.close()
D = {}
for name in names:if len(name.split()) == 1:# 修正此处,保证键的一致性D[name[:-1]] = D.get(name[:-1], 0) + 1
l = list(D.items())
l.sort(key=lambda s: s[1], reverse=True)
name = l[0][0]
score = l[0][1]
print("最具人气明星为:{},票数为:{}".format(name, score))
题型共同特点
这些题目均围绕 数据统计与分析 展开,核心场景包括:
- 数据输入:通过文件读取(如
vote.txt
)或键盘输入获取原始数据。 - 数据处理:对数据进行筛选(如判断有效票)、统计(如行业数量、票数统计)。
- 结果输出:对处理后的数据排序,按指定格式输出关键结果(如统计数量、最值信息)。
核心知识点讲解
- 文件操作
- 打开与读取:使用
open("文件名", "r")
打开文件,readlines()
读取所有行,处理后用close()
关闭文件。 - 写入文件:以写模式
open("文件名", "w")
打开文件,用write()
写入内容。
- 打开与读取:使用
- 字符串处理
- 分割字符串:
split()
方法按空格等分隔符拆分字符串,如name.split()
用于获取每行的元素数量。
- 分割字符串:
- 字典统计
- 利用字典键值对统计数据,如
D[key] = D.get(key, 0) + 1
:D.get(key, 0)
避免键不存在时报错,初始值为0
,每次出现对应键时数量加1
。
- 利用字典键值对统计数据,如
- 列表排序
list.sort(key=lambda x: x[1], reverse=True)
:按列表元素的第二个值(如票数、分数)降序排序,lambda
定义排序依据。
- 输入输出
- 输入:
input()
接收键盘输入,结合循环处理多行输入。 - 输出格式化:
print("{}:{}".format(zy, num))
,用占位符{}
匹配变量,实现指定格式输出。
- 输入:
解题通用方法步骤
- 数据读取
- 文件场景:用
open()
打开文件,readlines()
读取内容,关闭文件。 - 输入场景:
input()
接收输入,循环处理多行数据。
- 文件场景:用
- 数据筛选与统计
- 遍历数据,用条件判断(如
if len(name.split()) == 1
)筛选有效数据。 - 借助字典统计数量(如行业数、票数)。
- 遍历数据,用条件判断(如
- 结果处理
- 将字典转换为列表(如
list(D.items())
),排序获取最值(如最高票数、最低分)。
- 将字典转换为列表(如
- 格式化输出
- 按题目要求格式,用
format()
或 f-string 输出结果,如print("最具人气明星为:{},票数为:{}".format(name, score))
。
- 按题目要求格式,用
操作的难点
1.数据的统计
这一部分主要要用到字典的键值对特性,将需要统计的对象(如明星姓名、行业名称)作为键,出现次数作为值。
代码的模板为:
data_dict = {}
for item in data_list: data_dict[item] = data_dict.get(item, 0) + 1 # 若键存在,值+1;若不存在,初始化为0再+1
代码的解释:
- 首先,创造一个字典
- 其次,在我们上面从文本中读取的字符串进行循环,逐一判断是谁的票,是这个人的票就加一,不是这个人的票就创建这个人的键,然后初始为0,再加1
- 这个循环过后,我们就得到了一个统计数据的键值对——字典。
存在这样的一种:若数据包含多种属性(如课程名 + 分数),可先提取统计关键项再操作,我们通过解包操作加以实现:
示例代码
course_data = [("数学", 90), ("语文", 85), ("数学", 95)]
course_count = {}
for course, _ in course_data: course_count[course] = course_count.get(course, 0) + 1
# 结果:{'数学': 2, '语文': 1}
2.数据的筛选
1. 条件判断筛选
通过 if
语句定义筛选规则,常见场景:
- 格式筛选:如“一行只有一个姓名的投票才有效”,用
len(name.split()) == 1
判断。 - 范围筛选:如“分数在 60 分以上为及格”,用
score >= 60
判断。 - 代码模板:
valid_data = [] for item in raw_data: if 筛选条件: # 如 len(item.split()) == 1 valid_data.append(item)
2. 结合文件操作筛选
从文件读取数据时,边读取边筛选。
- 示例:筛选有效投票并写入新文件
with open("vote.txt", "r") as f: votes = f.readlines() valid_votes = [] for vote in votes: if len(vote.split()) == 1: # 一行一个姓名 valid_votes.append(vote.strip()) # 去除换行符 # 将有效投票写入新文件 with open("valid_vote.txt", "w") as f: f.writelines(valid_votes)
3. 多条件组合筛选
复杂场景需多个条件组合,用逻辑运算符(and
/or
)连接。
- 示例:筛选既有效又符合特定范围的数据
# 假设数据格式为 [姓名, 票数] data = [("张三", 10), ("李四", 5), ("王五", 20)] filtered_data = [] for name, count in data: if len(name) > 2 and count > 10: # 姓名长度超2字且票数超10 filtered_data.append((name, count)) # 结果:[("王五", 20)]
类似题目
题目
考生文件夹下存在3个Python源文件(分别对应3个问题)与1个文本文件(输入数据“命运.txt”),需按源文件内部说明修改代码,实现以下功能:
- 问题1(5分):在
PY301-1.py
中修改代码,对“命运.txt”进行字符频次统计,输出频次最高的中文字符(不含标点符号)及其频次,格式为“字符:频次”(如“理:224”)。 - 问题2(5分):在
PY301-2.py
中修改代码,对“命运.txt”进行字符频次统计,按频次由高到低,屏幕输出前10个频次最高的字符(不含回车符),字符连续无间隔输出。 - 问题3(10分):在
PY301-3.py
中修改代码,对“命运.txt”进行字符频次统计,将所有字符(含中文、标点、英文等符号,不含空格和回车)按频次从高到低排序,将排序后的字符及频次输出到考生文件夹下的“命运-频次排序.txt”。字符与频次间用英文冒号“:”分隔,字符间用英文逗号“,”分隔(参考CSV格式,最后无逗号)。
解答
# 打开文件
with open('命运.txt', 'r', encoding='utf-8') as f:txt = f.read()# 定义字典用于统计字符频次
d = {}
# 遍历文本中的每个字符
for i in txt:# 过滤掉标点符号if i not in ",。?!《》【】[]“”‘’":# 统计字符频次d[i] = d.get(i, 0) + 1# 将字典的键值对转换为列表
ls = list(d.items())
# 对列表按字符频次从高到低排序
ls.sort(key=lambda x: x[1], reverse=True)
# 输出频次最高的字符及其频次
print("{}:{}".format(ls[0][0], ls[0][1]))
# 打开文件
with open('命运.txt', 'r', encoding='utf-8') as f:txt = f.read()# 定义字典用于统计字符频次
d = {}
# 遍历文本中的每个字符
for i in txt:# 过滤掉回车符if i not in '\n':# 统计字符频次d[i] = d.get(i, 0) + 1# 将字典的键值对转换为列表
ls = list(d.items())
# 对列表按字符频次从高到低排序
ls.sort(key=lambda x: x[1], reverse=True)# 输出前 10 个频次最高的字符
for k in range(10):print(ls[k][0], end='')
# 打开命运.txt 文件用于读取
with open('命运.txt', 'r', encoding='utf-8') as f:txt = f.read()# 定义字典用于统计字符频次
d = {}
# 遍历文本中的每个字符
for i in txt:# 过滤掉空格和回车符if i not in ' \n':# 统计字符频次d[i] = d.get(i, 0) + 1# 将字典的键值对转换为列表
ls = list(d.items())
# 对列表按字符频次从高到低排序
ls.sort(key=lambda x: x[1], reverse=True)# 用于存储格式化后的字符和频次字符串
result_str = []
# 遍历排序后的列表
for char, freq in ls:result_str.append(f"{char}:{freq}")# 将列表元素用逗号连接成字符串
output_str = ','.join(result_str)# 打开命运-频次排序.txt 文件用于写入
with open('命运-频次排序.txt', 'w', encoding='utf-8') as fi:fi.write(output_str)
其它一题
题目
题目是在 PY202.py 中完善代码,根据字典查找用户信息,生成验证码。首先,导入随机模块生成验证码。然后,获取用户输入,检查是否在字典中。存在的话,生成四位数验证码,输出信息;不存在则提示。
解析
import random
random.seed(2)
pdict = {'Alice': ['123456789'],'Bob': ['234567891'],'Lily': ['345678912'],'Jane': ['456789123']
}
name = input('请输入一个人名:')
if name in pdict:print("{} {} {}".format(name, pdict.get(name)[0], random.randint(1000, 9999)))
else:print("对不起,您输入的用户信息不存在。")