《Python學習之字典(一):基礎操作與核心用法》

堅持用 清晰易懂的圖解 + 代碼語言,讓每個知識點變得簡單!
🚀呆頭個人主頁詳情
🌱 呆頭個人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字典添加/修改元素的不同方法dict['new_key'] = value直接賦值:如果鍵存在則更新值如果鍵不存在則添加新鍵值對dict.update({'key1': val1, 'key2': val2})批量更新:使用另一個字典中的鍵值對更新當前字典dict.setdefault('key', default_value)條件添加:只在鍵不存在時添加鍵值對dict |= {'key1': val1, 'key2': val2}合并運算符(Python 3.9+):類似update方法但語法更簡潔用戶代碼Python字典

五、刪除元素

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() 方法在需要重用字典對象但清除其內容時特別有用。

40%30%15%10%5%字典刪除操作使用頻率del dict[key]dict.pop(key)dict.popitem()dict.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)

這個例子展示了如何使用嵌套字典來構建一個簡單的學生成績管理系統,并實現了一些基本的統計功能。

STUDENTstringstudent_idstringnameCOURSEstringcourse_nameintgradetakes

七、總結與最佳實踐

1.字典使用的最佳實踐

  1. 選擇合適的鍵:使用不可變類型作為鍵,優先考慮簡單類型如字符串、數字或元組。
  2. 使用get()方法安全訪問:當不確定鍵是否存在時,使用get()方法避免異常。
  3. 使用字典推導式:對于需要批量創建或轉換的字典,考慮使用字典推導式提高代碼可讀性。
  4. 合理使用嵌套字典:對于復雜數據結構,可以使用嵌套字典,但注意不要嵌套過深,以免影響可讀性。
  5. 定期清理不需要的鍵:對于長期運行的程序,定期清理不再需要的鍵值對,避免內存泄漏。

2.常見陷阱與注意事項

  1. 可變對象作為鍵:避免使用列表、字典等可變對象作為鍵,這會導致錯誤。
  2. 字典的淺拷貝:使用dict.copy()創建的是淺拷貝,嵌套的可變對象仍然是引用。
  3. 鍵的大小寫敏感性:字典的鍵是大小寫敏感的,'Name’和’name’是兩個不同的鍵。
  4. 字典的內存開銷:字典比列表占用更多的內存,對于大量簡單數據,考慮使用其他數據結構。

📢 如果你也喜歡這種"不呆頭"的技術風格:
👁? 【關注】 看一個非典型程序員如何用野路子解決正經問題
👍 【點贊】 給"不寫八股文"的技術分享一點鼓勵
🔖 【收藏】 把這些"奇怪但有用"的代碼技巧打包帶走
💬 【評論】 來聊聊——你遇到過最"呆頭"的 Bug 是啥?
🗳? 【投票】 您的投票是支持我前行的動力
技術沒有標準答案,讓我們一起用最有趣的方式,寫出最靠譜的代碼! 🎮💻


參考鏈接

  1. Python官方文檔 - 字典
  2. Python字典的實現原理
  3. Python 3.7中字典保持插入順序的變化
  4. Python字典的性能優化
  5. Python數據結構性能比較

關鍵詞標簽

#Python #字典 #數據結構 #鍵值對 #哈希表

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/919069.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/919069.shtml
英文地址,請注明出處:http://en.pswp.cn/news/919069.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[安洵杯 2019]Attack

BUUCTF在線評測BUUCTF 是一個 CTF 競賽和訓練平臺&#xff0c;為各位 CTF 選手提供真實賽題在線復現等服務。https://buuoj.cn/challenges#[%E5%AE%89%E6%B4%B5%E6%9D%AF%202019]Attack流量分析題&#xff0c;瀏覽的時候發現攻擊者上傳信息頁面&#xff0c; 直接搜索 flag 就…

復合機器人食品分揀生產線:一體化控制系統引領高效柔性新食代

在食品工業高速發展的今天&#xff0c;面對種類繁多、形態各異的原料分揀需求&#xff0c;以及日益嚴格的衛生安全與效率要求&#xff0c;傳統的固定式分揀設備已難以勝任。復合機器人食品分揀生產線憑借其融合移動&#xff08;AMR&#xff09;與操作&#xff08;機械臂&#x…

二十七、動態SQL

動態SQL介紹動態SQL&#xff1a;if與where標簽動態案例-動態更新EmpMapper&#xff08;接口&#xff09;中對應代碼塊 //動態更新員工public void update2(Emp emp);EmpMapper.xml中對應代碼塊 <!-- 動態更新員工--><update id"update2">update emp<s…

AI可行性分析:數據×算法×反饋=成功

3.1 從場景到AI可行性分析:需求拆解為“數據+算法+反饋” 核心公式: AI可行性 = 數據可獲得性 算法適配性 反饋閉環性 (任一要素為0則需求不可行) 一、傳統需求 vs AI需求本質差異 需求文檔對比(電商案例) 維度 傳統需求文檔(購物車功能) AI需求文檔(商品推薦系…

【圖論】分層圖 / 拆點

大多數都是同一個套路&#xff0c;將圖拆開成幾個圖&#xff0c;每一層都對應著一個不同的狀態&#xff0c;比如把到點 i 的狀態拆成經過了 j 次操作所得的 xx 結果&#xff0c;一般數據不會很大 目前遇到的可分為 3 類&#xff1a; ①.給你最多 k 次操作&#xff0c;求 xx 結…

VS Code配置MinGW64編譯MATIO庫

VS Code 使用 MinGW64 編譯 C 代碼并配置 MATIO 庫的完整步驟 1. 安裝 MSYS2 下載 MSYS2 訪問 MSYS2 官網下載安裝包&#xff08;選擇 x86_64 版本&#xff09;默認安裝路徑&#xff1a;C:\msys64 更新 MSYS2 包數據庫 打開 MSYS2 MinGW 64-bit&#xff08;注意不是 MSYS&…

【前端Vue】使用ElementUI實現表單中可選擇可編輯的下拉框

由于項目在vue的開發框架下&#xff0c;因此使用ElementUI組件庫進行實現。我希望可選擇可編輯的下拉框右側有跟下拉框一樣的箭頭&#xff0c;并且在未輸入任何內容時&#xff0c;點擊該框體會出現選擇列表進行填充數據的選擇&#xff0c;點擊選中數據后列表消失&#xff0c;數…

每日五個pyecharts可視化圖表-line:從入門到精通 (4)

歡迎來到pyecharts折線圖系列的第四篇文章&#xff01;在前三篇中&#xff0c;我們已經掌握了多種折線圖類型&#xff0c;包括基本折線圖、平滑折線圖、雨量流量關系圖、多X軸折線圖、堆疊區域圖和階梯圖等。在本文中&#xff0c;我們將繼續探索五種更高級的折線圖類型&#xf…

MySQL中的字符串函數

目錄 一、字符串【分割】函數&#xff1a;SUBSTRING_INDEX() SUBSTRING_INDEX函數 練習題 統計每種性別的人數 提取博客URL中的用戶名 截取出年齡 SQL83 商品id數據清洗統計 SQL250 查找字符串中逗號出現的次數 二、字符串【截取】函數&#xff1a;SUBSTRING() 基本語…

CodeBuddy IDE深度體驗:AI驅動的全棧開發新時代

在人工智能技術迅猛發展的今天&#xff0c;開發者工具正在經歷一場深刻的變革。騰訊推出的CodeBuddy IDE作為全球首個“產設研一體”的AI全棧高級工程師工具&#xff0c;重新定義了開發者的日常工作流程。 從需求分析到設計、編碼、部署&#xff0c;CodeBuddy通過AI能力將傳統…

實現Android圖片手勢縮放功能的完整自定義View方案,結合了多種手勢交互功能

主要功能特點&#xff1a;支持雙指手勢縮放圖片&#xff0c;通過ScaleGestureDetector實現平滑的縮放效果25雙擊圖片可切換初始大小和中等放大比例16使用Matrix進行圖像變換&#xff0c;保持縮放中心點為手勢焦點位置57自動縮放動畫通過Runnable實現漸進式變化1限制最小和最大縮…

uni-app實戰教程 從0到1開發 畫圖軟件 (橡皮擦)

一、本期內容簡述1. 開發內容上一期&#xff0c;我們一起學習了如何進行繪畫&#xff0c;本期我們將學習如何擦除我們所繪畫的內容&#xff0c;也就是“橡皮擦”功能。首先&#xff0c;我們應該明確需求&#xff0c;橡皮擦可以擦除掉我們繪畫的內容。2. 開發需求所以開發需求&a…

《A Practical Guide to Building Agents》文檔學習

《A Practical Guide to Building Agents》文檔總結 該文檔是一份面向產品和工程團隊的實用指南&#xff0c;旨在幫助團隊探索并構建首個基于大語言模型&#xff08;LLM&#xff09;的智能體&#xff08;Agent&#xff09;&#xff0c;提煉了大量客戶部署經驗&#xff0c;提供了…

OpenCV圖像注冊模塊

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 注冊模塊實現了參數化圖像配準。所實現的方法是直接對齊&#xff08;direct alignment&#xff09;&#xff0c;即&#xff0c;它直接使用像素值來…

模型驅動與分布式建模:技術深度與實戰落地指南

摘要 在AI、云原生與全球化協作的大潮中&#xff0c;模型驅動架構&#xff08;MDA&#xff09;與分布式建模不再是概念&#xff0c;而是支撐復雜系統設計與持續演化的核心引擎。本文從元模型、模型轉換引擎&#xff0c;到協同協議、沖突解決算法&#xff0c;再到AI輔助建模與自…

計算機基礎速通--數據結構·圖的基礎應用二(基礎圖算法)

如有問題大概率是我的理解比較片面&#xff0c;歡迎評論區或者私信指正。 最近了解到了一個新的改變和提高自己的方法時刻記錄不論多小的事情都記下&#xff0c;我目前用了4天&#xff0c;之前感覺一天天忙死但沒啥收獲&#xff0c;但是記錄了之后知道自己的時間花在了哪里&…

設計模式-策略模式 Java

模式概述 策略模式是一種行為型設計模式&#xff0c;它通過定義一系列可互換的算法&#xff0c;并將每個算法封裝成獨立類&#xff0c;使客戶端能夠根據需要動態切換算法 簡單代碼示例 // 1. 抽象策略接口 interface PaymentStrategy {void pay(int amount); }// 2. 具體策略實…

【機器學習深度學習】客觀評估訓練程度

目錄 前言 一、什么是客觀評估&#xff1f; 二、客觀評估的兩大核心方法 1. 判別式評測&#xff08;Discriminative Evaluation&#xff09; 2. 生成式評測&#xff08;Generative Evaluation&#xff09; 三、為什么客觀評估成本更高&#xff1f; 1.訓練目標收緊 2.訓…

Linux軟件編程:線程間通信

目錄 一、線程間通信基礎 1. 概念 2. 通信基礎&#xff1a;共享空間 二、互斥鎖&#xff08;Mutex&#xff09; 1. 概念 2. 使用流程 3. 函數接口 三、死鎖 1. 概念 2. 死鎖產生的 4 個必要條件 3. 避免死鎖的方法 四、信號量&#xff08;Semaphore&#xff09; 1…

【學習筆記】JVM GC回收機制

1.三種基本的垃圾回收算法 1>標記-清除法 ①先將從樹根開始&#xff0c;可以到達的對象標記為可達&#xff08;JVM中的對象們存儲為一顆樹&#xff09; ②將沒有標記的對象清除掉 缺點&#xff1a;會產生大量內存碎片 2>復制算法&#xff08;新生代&#xff09; ①先將a區…