文章目錄
- 簡單應用
- 第一題
- 第二題
- 第三題
- 第四題
- 題型共同特點
- 核心知識點講解
- 解題通用方法步驟
- 操作的難點
- 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("對不起,您輸入的用戶信息不存在。")