堅持用 清晰易懂的圖解 + 代碼語言,讓每個知識點變得簡單!
🚀呆頭個人主頁詳情
🌱 呆頭個人Gitee代碼倉庫
📌 呆頭詳細專欄系列
座右銘: “不患無位,患所以立。”
Python學習之字典(一):基礎操作與核心用法
- 摘要
- 一、字典是什么?
- 1.字典的特性
- 2.字典與其他數據結構的對比
- 二、創建字典
- 1.使用花括號創建
- 2.使用dict()構造函數
- 3.字典推導式
- 4.fromkeys()方法
- 三、查找鍵(Key)
- 1.使用方括號訪問
- 2.使用get()方法
- 3.使用in運算符檢查鍵是否存在
- 四、新增和修改元素
- 1.添加新鍵值對
- 2.修改現有鍵的值
- 3.使用update()方法批量更新
- 4.使用setdefault()方法
- 五、刪除元素
- 1.使用del語句
- 2.使用pop()方法
- 3.使用popitem()方法
- 4.使用clear()方法
- 六、實際應用示例
- 1.學生成績管理系統
- 七、總結與最佳實踐
- 1.字典使用的最佳實踐
- 2.常見陷阱與注意事項
- 參考鏈接
- 關鍵詞標簽
摘要
字典是Python中最強大的數據結構之一,它讓我們能夠用"鍵-值"的方式組織數據,實現高效查找和管理。本文將帶你深入了解Python字典的基礎知識和核心操作。
一、字典是什么?
字典(Dictionary)是Python中的一種內置數據類型,它是一個可變的、無序的鍵值對集合。與列表通過索引訪問元素不同,字典通過鍵(key)來訪問對應的值(value)。
1.字典的特性
字典的核心優勢在于它的查找效率。由于采用了哈希表(Hash Table)的實現方式,字典可以在常數時間內完成查找操作,無論字典有多大。
2.字典與其他數據結構的對比
特性 | 字典(dict) | 列表(list) | 元組(tuple) | 集合(set) |
---|---|---|---|---|
可變性 | ? | ? | ? | ? |
有序性 | ??(3.7+保持插入順序) | ? | ? | ? |
索引訪問 | ? | ? | ? | ? |
鍵值對 | ? | ? | ? | ? |
元素唯一性 | 鍵唯一 | 允許重復 | 允許重復 | ? |
查找效率 | O(1) | O(n) | O(n) | O(1) |
二、創建字典
Python提供了多種創建字典的方法,讓我們一一了解。
1.使用花括號創建
最直接的方式是使用花括號 {}
并在其中列出鍵值對:
# 創建一個學生信息字典
student = {'name': '張三','age': 20,'major': '計算機科學','gpa': 3.8
}# 創建一個空字典
empty_dict = {}print(student) # 輸出完整字典
print(type(empty_dict)) # 輸出: <class 'dict'>
這種方法直觀明了,適合當你預先知道字典內容時使用。
2.使用dict()構造函數
dict()
構造函數提供了另一種創建字典的方式:
# 使用關鍵字參數創建字典
student = dict(name='李四', age=22, major='數學', gpa=3.9)# 從鍵值對序列創建
items = [('name', '王五'), ('age', 21), ('major', '物理')]
student2 = dict(items)print(student) # {'name': '李四', 'age': 22, 'major': '數學', 'gpa': 3.9}
print(student2) # {'name': '王五', 'age': 21, 'major': '物理'}
dict()
構造函數特別適合從其他數據結構轉換或動態生成字典。
3.字典推導式
字典推導式(Dictionary Comprehension)是一種簡潔創建字典的方法:
# 創建平方字典 {0:0, 1:1, 2:4, 3:9, 4:16}
squares = {x: x**2 for x in range(5)}# 創建字符及其ASCII碼的字典
ascii_dict = {chr(i): i for i in range(97, 123)} # a-z的ASCII碼print(squares) # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
print(ascii_dict) # {'a': 97, 'b': 98, ..., 'z': 122}
字典推導式在需要批量生成鍵值對時特別有用,代碼簡潔且易讀。
4.fromkeys()方法
fromkeys()
方法用于創建一個新字典,以序列中的元素為鍵,以指定值為對應的值:
# 創建具有相同默認值的字典
keys = ['name', 'age', 'major', 'gpa']
student = dict.fromkeys(keys, None)# 創建具有默認值的課程成績字典
courses = ['Math', 'Physics', 'Computer Science', 'English']
grades = dict.fromkeys(courses, 0)print(student) # {'name': None, 'age': None, 'major': None, 'gpa': None}
print(grades) # {'Math': 0, 'Physics': 0, 'Computer Science': 0, 'English': 0}
fromkeys()
方法在需要初始化多個鍵具有相同默認值的字典時非常有用。
三、查找鍵(Key)
字典的主要用途是通過鍵快速查找對應的值。Python提供了多種方法來實現這一功能。
1.使用方括號訪問
最直接的方式是使用方括號 []
和鍵名:
student = {'name': '張三','age': 20,'major': '計算機科學','gpa': 3.8
}# 訪問字典中的值
print(student['name']) # 輸出: 張三
print(student['gpa']) # 輸出: 3.8# 如果鍵不存在,會引發KeyError
try:print(student['phone'])
except KeyError as e:print(f"錯誤: {e}") # 輸出: 錯誤: 'phone'
方括號訪問方式簡單直接,但如果鍵不存在會引發 KeyError
異常。
2.使用get()方法
get()
方法提供了一種更安全的訪問方式,允許指定默認值:
student = {'name': '張三','age': 20,'major': '計算機科學'
}# 使用get()方法訪問
name = student.get('name') # 返回: '張三'
phone = student.get('phone') # 鍵不存在,返回None
address = student.get('address', '未提供') # 鍵不存在,返回默認值'未提供'print(name) # 張三
print(phone) # None
print(address) # 未提供
get()
方法的優勢在于它不會因為鍵不存在而引發異常,而是返回 None
或指定的默認值。
3.使用in運算符檢查鍵是否存在
在訪問鍵之前,可以先檢查鍵是否存在:
student = {'name': '張三', 'age': 20, 'major': '計算機科學'}# 檢查鍵是否存在
if 'name' in student:print(f"姓名: {student['name']}")if 'phone' not in student:print("電話信息不存在")# 根據鍵是否存在執行不同操作
gpa = student['gpa'] if 'gpa' in student else '未記錄'
print(f"GPA: {gpa}") # 輸出: GPA: 未記錄
使用 in
運算符可以避免因鍵不存在而引發的異常,使代碼更加健壯。
四、新增和修改元素
字典是可變的數據結構,我們可以輕松地添加新的鍵值對或修改現有的值。
1.添加新鍵值對
向字典添加新鍵值對非常簡單,只需使用賦值語句:
# 創建一個空字典
user = {}# 添加鍵值對
user['username'] = 'python_lover'
user['email'] = 'python@example.com'
user['active'] = True
user['login_count'] = 42print(user)
# 輸出: {'username': 'python_lover', 'email': 'python@example.com', 'active': True, 'login_count': 42}
這種方式直觀簡單,是添加新鍵值對最常用的方法。
2.修改現有鍵的值
修改現有鍵的值與添加新鍵的語法相同:
student = {'name': '張三','age': 20,'major': '計算機科學','gpa': 3.5
}# 修改現有鍵的值
student['age'] = 21
student['gpa'] = 3.8print(student)
# 輸出: {'name': '張三', 'age': 21, 'major': '計算機科學', 'gpa': 3.8}
如果鍵已存在,賦值操作會更新對應的值;如果鍵不存在,則會添加新的鍵值對。
3.使用update()方法批量更新
update()
方法允許我們使用另一個字典或鍵值對序列來更新當前字典:
student = {'name': '張三','age': 20,'major': '計算機科學'
}# 使用另一個字典更新
new_info = {'age': 21, 'gpa': 3.9, 'graduation_year': 2023}
student.update(new_info)print(student)
# 輸出: {'name': '張三', 'age': 21, 'major': '計算機科學', 'gpa': 3.9, 'graduation_year': 2023}# 使用關鍵字參數更新
student.update(phone='123-456-7890', address='北京市海淀區')print(student)
# 輸出包含新增的phone和address字段
update()
方法特別適合需要批量更新或合并字典的場景。
4.使用setdefault()方法
setdefault()
方法提供了一種特殊的更新方式,它只在鍵不存在時才設置值:
user = {'username': 'python_lover', 'email': 'python@example.com'}# 如果鍵不存在,則添加鍵值對
user.setdefault('active', True) # 添加新鍵值對
user.setdefault('username', 'new_user') # 鍵已存在,不會修改print(user)
# 輸出: {'username': 'python_lover', 'email': 'python@example.com', 'active': True}
setdefault()
方法在需要為不存在的鍵設置默認值時特別有用。
五、刪除元素
Python提供了多種方法來刪除字典中的元素,每種方法適用于不同的場景。
1.使用del語句
del
語句可以刪除字典中的特定鍵值對:
student = {'name': '張三','age': 20,'major': '計算機科學','gpa': 3.8,'graduated': False
}# 刪除特定鍵值對
del student['graduated']
print(student) # 'graduated'鍵已被刪除# 嘗試刪除不存在的鍵會引發KeyError
try:del student['phone']
except KeyError as e:print(f"錯誤: {e}") # 輸出: 錯誤: 'phone'
del
語句是最直接的刪除方式,但如果鍵不存在會引發異常。
2.使用pop()方法
pop()
方法刪除指定的鍵并返回對應的值:
student = {'name': '張三','age': 20,'major': '計算機科學','gpa': 3.8
}# 刪除鍵并獲取值
age = student.pop('age')
print(f"刪除的年齡值: {age}") # 輸出: 刪除的年齡值: 20
print(student) # 'age'鍵已被刪除# 刪除可能不存在的鍵,提供默認值避免異常
phone = student.pop('phone', '未設置')
print(f"刪除的電話值: {phone}") # 輸出: 刪除的電話值: 未設置
pop()
方法的優勢在于它既能刪除鍵值對,又能返回被刪除的值,并且可以指定默認值來處理鍵不存在的情況。
3.使用popitem()方法
popitem()
方法刪除并返回字典中的一個鍵值對:
student = {'name': '張三','age': 20,'major': '計算機科學','gpa': 3.8
}# 刪除并返回一個鍵值對
item = student.popitem()
print(f"刪除的項: {item}") # 在Python 3.7+中,刪除最后插入的項
print(student) # 字典少了一個鍵值對# 對空字典調用popitem()會引發KeyError
empty_dict = {}
try:empty_dict.popitem()
except KeyError as e:print(f"錯誤: {e}") # 輸出: 錯誤: 'popitem(): dictionary is empty'
在Python 3.7及以后的版本中,popitem()
方法會刪除并返回最后插入的鍵值對,這使得它可以用作LIFO(后進先出)的數據結構。
4.使用clear()方法
clear()
方法刪除字典中的所有鍵值對:
student = {'name': '張三','age': 20,'major': '計算機科學','gpa': 3.8
}# 清空字典
student.clear()
print(student) # 輸出: {}
clear()
方法在需要重用字典對象但清除其內容時特別有用。
六、實際應用示例
讓我們通過一個實際的應用示例來鞏固對字典的理解:
1.學生成績管理系統
# 創建一個學生成績管理系統
def create_grade_system():# 初始化空字典students = {}# 添加學生信息students['10001'] = {'name': '張三','courses': {'Math': 85,'Physics': 92,'Computer Science': 95}}students['10002'] = {'name': '李四','courses': {'Math': 78,'Physics': 85,'Chemistry': 90}}# 添加新學生students['10003'] = {'name': '王五', 'courses': {}}# 為王五添加課程成績students['10003']['courses']['Math'] = 92students['10003']['courses']['English'] = 88return students# 計算學生的平均成績
def calculate_average(student):courses = student['courses']if not courses:return 0total = sum(courses.values())return total / len(courses)# 查找成績最高的課程
def find_best_course(student):courses = student['courses']if not courses:return Nonereturn max(courses.items(), key=lambda x: x[1])# 使用示例
students = create_grade_system()# 打印所有學生信息
for student_id, info in students.items():avg = calculate_average(info)best_course = find_best_course(info)print(f"學號: {student_id}, 姓名: {info['name']}")print(f"課程: {list(info['courses'].keys())}")print(f"平均成績: {avg:.2f}")if best_course:print(f"最好的課程: {best_course[0]}, 成績: {best_course[1]}")print("-" * 30)
這個例子展示了如何使用嵌套字典來構建一個簡單的學生成績管理系統,并實現了一些基本的統計功能。
七、總結與最佳實踐
1.字典使用的最佳實踐
- 選擇合適的鍵:使用不可變類型作為鍵,優先考慮簡單類型如字符串、數字或元組。
- 使用get()方法安全訪問:當不確定鍵是否存在時,使用
get()
方法避免異常。 - 使用字典推導式:對于需要批量創建或轉換的字典,考慮使用字典推導式提高代碼可讀性。
- 合理使用嵌套字典:對于復雜數據結構,可以使用嵌套字典,但注意不要嵌套過深,以免影響可讀性。
- 定期清理不需要的鍵:對于長期運行的程序,定期清理不再需要的鍵值對,避免內存泄漏。
2.常見陷阱與注意事項
- 可變對象作為鍵:避免使用列表、字典等可變對象作為鍵,這會導致錯誤。
- 字典的淺拷貝:使用
dict.copy()
創建的是淺拷貝,嵌套的可變對象仍然是引用。 - 鍵的大小寫敏感性:字典的鍵是大小寫敏感的,'Name’和’name’是兩個不同的鍵。
- 字典的內存開銷:字典比列表占用更多的內存,對于大量簡單數據,考慮使用其他數據結構。
📢 如果你也喜歡這種"不呆頭"的技術風格:
👁? 【關注】 看一個非典型程序員如何用野路子解決正經問題
👍 【點贊】 給"不寫八股文"的技術分享一點鼓勵
🔖 【收藏】 把這些"奇怪但有用"的代碼技巧打包帶走
💬 【評論】 來聊聊——你遇到過最"呆頭"的 Bug 是啥?
🗳? 【投票】 您的投票是支持我前行的動力
技術沒有標準答案,讓我們一起用最有趣的方式,寫出最靠譜的代碼! 🎮💻
參考鏈接
- Python官方文檔 - 字典
- Python字典的實現原理
- Python 3.7中字典保持插入順序的變化
- Python字典的性能優化
- Python數據結構性能比較
關鍵詞標簽
#Python #字典 #數據結構 #鍵值對 #哈希表