Python列表、集合、字典核心區(qū)別舉例詳解
Python 列表、集合、字典核心區(qū)別:從班級分數統計案例徹底講透
在Python編程學習中,列表(list)、集合(set)、字典(dict)是最常用的三大核心數據結構。很多新手初期極易混淆三者的語法和使用場景——比如同樣用大括號包裹的集合和字典、看似都能存數據的列表和集合,到底該在什么場景下用什么結構?
本文將以「班級分數統計」這一貼近實際的案例為核心,從語法特性、使用場景、核心差異三個維度,徹底講清列表、集合、字典的區(qū)別,幫你建立清晰的Python數據結構認知。

一、案例背景:班級分數統計的核心需求
先看一個典型的實際場景:
某班級某次考試的分數列表為 [80,40,60,70,90,90,12,50,80],我們需要完成以下統計需求:
- 找出所有不重復的分數(去重);
- 統計每個分數對應的出現人數;
- 清晰展示分數與人數的對應關系。
這個需求恰好能完美體現列表、集合、字典的分工與差異,我們先看完整實現代碼,再拆解分析:
# 1. 原始分數數據:用列表存儲(允許重復、有序、可修改)
score = [80,40,60,70,90,90,12,50,80]
print("原始分數列表:", score)
# 2. 分數去重:用集合特性(自動去重、無序、元素唯一)
score_set = set(score)
print("\n去重后的分數集合:", score_set)
# 3. 統計每個分數出現次數:用字典存儲(鍵值對映射關系)
score_count = {} # 空大括號默認是字典,而非集合
# 遍歷去重后的分數集合,統計每個分數在原列表中的出現次數
for s in score_set:
score_count[s] = score.count(s)
# 4. 輸出統計結果
print("\n分數統計結果:")
for score_value, count in score_count.items():
print(f"成績?yōu)閧score_value}分的有{count}人")
# 5. 完整字典展示
print("\n統計結果字典:", score_count)
運行結果:
原始分數列表: [80, 40, 60, 70, 90, 90, 12, 50, 80]
去重后的分數集合: {70, 80, 12, 40, 50, 60, 90}
分數統計結果:
成績?yōu)?0分的有1人
成績?yōu)?0分的有2人
成績?yōu)?2分的有1人
成績?yōu)?0分的有1人
成績?yōu)?0分的有1人
成績?yōu)?0分的有1人
成績?yōu)?0分的有2人
統計結果字典: {70: 1, 80: 2, 12: 1, 40: 1, 50: 1, 60: 1, 90: 2}
二、核心拆解:列表、集合、字典在案例中的分工
2.1 列表(list):存儲原始數據的“基礎容器”
在案例中,score = [80,40,60,70,90,90,12,50,80] 是典型的列表應用,我們先明確列表的核心特性:
(1)語法與定義
- 標識:用
[]包裹元素,元素間用逗號分隔; - 空列表定義:
empty_list = []; - 核心特點:有序、可變、允許重復元素。
(2)在案例中的作用
列表是存儲原始分數的最佳選擇,原因如下:
- 考試分數天然是“有序”的(按學生順序記錄),列表的有序性可以保留原始記錄順序;
- 分數存在重復(如80、90各出現2次),列表允許重復元素的特性完全匹配;
- 后續(xù)若需要修改分數(如訂正錄錯的分數),列表的“可變”特性支持增刪改操作(如
score[2] = 65可修改第三個分數)。
(3)列表的常用操作(補充)
# 列表新增元素
score.append(85) # 末尾添加85
print("添加元素后:", score) # [80,40,60,70,90,90,12,50,80,85]
# 列表刪除元素
score.remove(90) # 刪除第一個90
print("刪除元素后:", score) # [80,40,60,70,90,12,50,80,85]
# 列表索引取值
print("第三個分數:", score[2]) # 60(索引從0開始)
2.2 集合(set):去重的“高效工具”
在案例中,score_set = set(score) 將列表轉為集合實現去重,這是集合最核心的應用場景,我們拆解集合的特性:
(1)語法與定義
- 標識:非空集合用
{}包裹(無鍵值對),空集合必須用set()(而非{}); - 空集合定義:
empty_set = set()(重點:{}是空字典,不是空集合); - 核心特點:無序、可變、元素唯一(自動去重)。
(2)在案例中的作用
集合的核心價值是“去重”,具體體現在:
- 原始分數列表有重復值(80、90),轉為集合后自動剔除重復,只保留唯一分數;
- 遍歷集合時,每個分數只處理一次,避免重復統計(若直接遍歷列表,會重復統計80、90)。
(3)集合的其他常用操作(補充)
集合的核心優(yōu)勢除了去重,還有高效的集合運算(交集、并集、差集),比如我們新增一個“及格分數集合”,可以快速篩選出及格/不及格分數:
# 定義及格分數集合(60分及以上)
pass_score = {60,70,80,90}
# 交集:找出既在score_set中又在pass_score中的分數(及格分數)
print("及格分數:", score_set & pass_score) # {70,80,60,90}
# 差集:找出score_set中有但pass_score中沒有的分數(不及格分數)
print("不及格分數:", score_set - pass_score) # {12,40,50}
# 并集:合并兩個集合(無重復)
print("所有分數合并:", score_set | pass_score) # {70,80,12,40,50,60,90}
2.3 字典(dict):存儲映射關系的“通訊錄”
在案例中,score_count = {} 定義空字典,最終存儲 {分數: 人數} 的映射關系,這是字典的核心應用場景:
(1)語法與定義
- 標識:用
{key: value}包裹,鍵(key)和值(value)用冒號分隔,鍵值對間用逗號分隔; - 空字典定義:
empty_dict = {}(重點:這是Python默認的空字典定義方式); - 核心特點:鍵值對映射、鍵唯一(重復鍵會覆蓋)、值可重復、3.7+版本有序。
(2)在案例中的作用
字典的核心價值是“鍵值對映射”,具體體現在:
- 鍵(key):唯一的分數值(如80、90),保證每個分數只對應一個統計結果;
- 值(value):該分數的出現次數(如80對應2,90對應2),存儲統計結果;
- 遍歷字典時,通過
items()方法可以同時獲取鍵(分數)和值(人數),方便輸出統計結果。
(3)字典的常用操作(補充)
# 新增鍵值對:添加分數85的統計(假設85出現1次)
score_count[85] = 1
print("新增后字典:", score_count) # {70:1,80:2,...85:1}
# 修改值:修正80分的統計次數(假設實際是3人)
score_count[80] = 3
print("修改后字典:", score_count) # {70:1,80:3,...}
# 按鍵取值
print("80分的人數:", score_count[80]) # 3
# 刪除鍵值對
del score_count[85]
print("刪除后字典:", score_count) # 移除85對應的鍵值對
三、列表、集合、字典核心對比表
為了讓你更直觀地記住三者的區(qū)別,我們整理了詳細的對比表,涵蓋語法、特性、使用場景等核心維度:
| 維度 | 列表(list) | 集合(set) | 字典(dict) |
|---|---|---|---|
| 語法標識 | [] | 非空:{元素},空:set() | {key: value},空:{} |
| 核心結構 | 單一元素序列 | 單一元素集合(無映射) | 鍵值對(key: value)映射 |
| 有序性 | 有序(索引固定) | 無序(無索引) | 3.7+有序,3.7以下無序 |
| 重復性 | 允許重復元素 | 元素唯一(自動去重) | 鍵唯一(重復鍵覆蓋),值可重復 |
| 可變性 | 可變(增刪改元素) | 可變(增刪元素) | 可變(增刪改鍵值對) |
| 索引方式 | 數字索引(如 list[0]) | 無索引(無法通過下標取值) | 鍵索引(如 dict['key']) |
| 核心優(yōu)勢 | 保留順序、支持重復、通用 | 高效去重、集合運算 | 鍵值映射、快速查找 |
| 典型場景 | 存儲原始有序數據(如分數列表) | 去重、篩選(如及格分數篩選) | 統計映射(如分數-人數統計) |
| 常用方法 | append()、remove()、count() | add()、update()、&/ | /- |
四、避坑指南:新手最易混淆的3個點
4.1 空大括號{}是字典,不是集合
這是最容易踩的坑!Python語法規(guī)定:
d = {}→ 空字典(dict);s = set()→ 空集合(set);- 錯誤寫法:
s = {}(誤以為是集合,實際是字典)。
驗證代碼:
d = {}
s = set()
print(type(d)) # <class 'dict'>
print(type(s)) # <class 'set'>
4.2 集合不能存儲可變元素
集合的元素必須是“不可哈希”的(如數字、字符串、元組),不能存儲列表、字典等可變元素,否則會報錯:
# 錯誤:集合中不能放列表
# s = {[1,2], 80} # TypeError: unhashable type: 'list'
# 正確:集合中放元組(不可變)
s = {(1,2), 80}
print(s) # {80, (1, 2)}
4.3 字典的鍵必須是不可變的
字典的鍵(key)和集合元素要求一致,必須是不可變類型,值(value)可以是任意類型:
# 錯誤:鍵不能是列表
# d = {[1,2]: 80} # TypeError: unhashable type: 'list'
# 正確:鍵是字符串/數字,值是列表
d = {"score_list": [80,90], 80: [1,2,3]}
print(d) # {'score_list': [80, 90], 80: [1, 2, 3]}
五、實戰(zhàn)總結:如何選擇合適的數據結構?
回到班級分數統計的案例,我們可以總結出一套“數據結構選擇口訣”,幫你快速決策:
- 需要保留順序、允許重復、頻繁修改 → 用列表(如存儲原始分數);
- 需要去重、集合運算(交集/并集) → 用集合(如分數去重、篩選及格分數);
- 需要鍵值映射、按“關鍵字”查找 → 用字典(如分數-人數統計、學生姓名-分數映射)。
再舉幾個實際開發(fā)中的例子,幫你鞏固:
- 存儲用戶輸入的多個關鍵詞 → 列表(
keywords = ["Python", "數據結構", "案例"]); - 篩選兩個關鍵詞列表的共同關鍵詞 → 集合(
set1 & set2); - 存儲用戶信息(姓名、年齡、手機號)→ 字典(
user = {"name": "張三", "age": 20, "phone": "13800138000"})。
六、完整案例代碼(可直接運行)
為了方便你復制使用,這里給出包含所有功能的完整代碼:
# ==================================
# 班級分數統計:列表+集合+字典綜合案例
# ==================================
# 1. 定義原始分數列表(有序、可重復、可變)
score = [80,40,60,70,90,90,12,50,80]
print("=== 原始數據 ===")
print("原始分數列表:", score)
print("列表長度(總人數):", len(score))
# 2. 列表轉集合實現去重(無序、唯一、可變)
score_set = set(score)
print("\n=== 去重處理 ===")
print("去重后的分數集合:", score_set)
print("去重后分數數量:", len(score_set))
# 3. 集合運算:篩選及格/不及格分數
pass_score = {60,70,80,90}
print("\n=== 集合運算(及格篩選) ===")
print("及格分數(交集):", score_set & pass_score)
print("不及格分數(差集):", score_set - pass_score)
# 4. 字典統計分數出現次數(鍵值對、鍵唯一)
score_count = {}
for s in score_set:
score_count[s] = score.count(s)
# 5. 輸出統計結果
print("\n=== 分數統計結果 ===")
# 按分數升序排序輸出(字典3.7+有序,排序更直觀)
for score_value in sorted(score_count.keys()):
print(f"成績?yōu)閧score_value}分的有{score_count[score_value]}人")
# 6. 字典常用操作演示
print("\n=== 字典操作演示 ===")
# 新增分數85的統計
score_count[85] = 1
print("新增85分后:", score_count)
# 修改80分的統計次數
score_count[80] = 3
print("修改80分次數后:", score_count)
# 刪除85分的統計
del score_count[85]
print("刪除85分后:", score_count)
七、總結
本文以“班級分數統計”為核心案例,詳細拆解了Python中列表、集合、字典的核心區(qū)別,核心要點總結如下:
- 列表是“有序的容器”,適合存儲原始、有序、可重復的數據,核心標識是
[]; - 集合是“去重的工具”,適合去重和集合運算,核心標識是
set()(空)/{元素}(非空); - 字典是“映射的通訊錄”,適合存儲鍵值對關系,核心標識是
{key: value},空字典為{}; - 新手避坑:
{}是空字典,不是空集合;集合元素和字典鍵必須是不可變類型。
掌握這三大數據結構的區(qū)別,是Python入門的關鍵一步。建議你結合本文的案例代碼多動手運行、修改,通過實際操作加深理解——當你能根據需求快速選擇合適的數據結構時,就真正掌握了Python數據結構的核心邏輯。
到此這篇關于Python列表、集合、字典核心區(qū)別的文章就介紹到這了,更多相關Python列表、集合、字典區(qū)別內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python Unittest根據不同測試環(huán)境跳過用例的方法
這篇文章主要給大家介紹了關于Python Unittest如何根據不同測試環(huán)境跳過用例的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起看看吧2018-12-12

