字典推導式是Python中一種簡潔高效的創建字典的方式,它允許我們通過一行代碼快速生成符合特定規則的字典。如果你熟悉列表推導式,那麼字典推導式的理解會非常輕鬆,因爲它們的語法結構類似,只是生成的是鍵值對而非單個元素。
1. 爲什麼需要字典推導式?¶
在介紹推導式之前,我們先回顧一下傳統的字典創建方式。比如,要生成一個包含1到5的平方的字典:
# 傳統方法:初始化空字典,循環賦值
squares = {}
for num in range(1, 6):
squares[num] = num **2
print(squares) # 輸出:{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
這種方法需要幾行代碼,如果數據量很大或規則複雜,會顯得繁瑣。而字典推導式可以將這個過程壓縮成一行,讓代碼更簡潔。
2. 字典推導式的基本語法¶
字典推導式的核心結構是:
{鍵表達式: 值表達式 for 變量 in 可迭代對象 [if 條件表達式]}
- 鍵表達式:生成字典的“鍵”,可以是變量、函數調用或運算結果。
- 值表達式:生成字典的“值”,同樣可以是變量、函數調用或運算結果。
- 可迭代對象:如列表、元組、range等可以循環的對象。
- if條件表達式(可選):用於過濾需要保留的元素,不滿足條件的會被排除。
3. 從簡單例子開始學¶
例子1:生成簡單鍵值對¶
假設我們有一個列表['a', 'b', 'c'],想生成一個鍵爲列表元素、值爲0的字典:
keys = ['a', 'b', 'c']
result = {key: 0 for key in keys}
print(result) # 輸出:{'a': 0, 'b': 0, 'c': 0}
這裏,key是循環變量,key: 0是鍵值對的表達式,遍歷列表keys生成每個鍵值對。
例子2:值爲計算結果¶
如果值需要是鍵的平方(如1:1,2:4),只需修改值表達式:
numbers = [1, 2, 3, 4]
squares = {num: num** 2 for num in numbers}
print(squares) # 輸出:{1: 1, 2: 4, 3: 9, 4: 16}
這裏num **2就是值的計算,生成每個數字的平方作爲值。
例子3:帶條件過濾¶
如果只想保留滿足條件的鍵值對,比如只保留偶數的鍵:
numbers = [1, 2, 3, 4, 5, 6]
even_squares = {num: num** 2 for num in numbers if num % 2 == 0}
print(even_squares) # 輸出:{2: 4, 4: 16, 6: 36}
條件if num % 2 == 0會過濾掉奇數,只保留偶數的鍵值對。
4. 進階:從其他可迭代對象生成字典¶
字典推導式不僅可以從列表生成,還可以從元組、range等可迭代對象生成。例如:
# 從元組生成字典
items = (('name', 'Alice'), ('age', 25), ('city', 'Beijing'))
person = {k: v for k, v in items}
print(person) # 輸出:{'name': 'Alice', 'age': 25, 'city': 'Beijing'}
# 從range生成字典(鍵是1-5,值是鍵的立方)
cubes = {num: num **3 for num in range(1, 6)}
print(cubes) # 輸出:{1: 1, 2: 8, 3: 27, 4: 64, 5: 125}
5. 注意:區分不同推導式¶
初學者常混淆三種推導式:
- 列表推導式:[表達式 for 變量 in 可迭代對象](結果是列表)
- 字典推導式:{鍵: 值 for 變量 in 可迭代對象}(結果是字典)
- 集合推導式:{表達式 for 變量 in 可迭代對象}(結果是集合,無重複元素)
例如:
# 列表推導式
print([num for num in range(1, 4)]) # [1, 2, 3]
# 字典推導式
print({num: num**2 for num in range(1, 4)}) # {1: 1, 2: 4, 3: 9}
# 集合推導式
print({num**2 for num in range(1, 4)}) # {1, 4, 9}
6. 總結:字典推導式的優勢¶
- 簡潔性:一行代碼完成複雜邏輯,避免重複的循環和賦值。
- 可讀性:直接表達“鍵值對生成規則”,比傳統循環更直觀。
- 效率:內部優化,比手動循環更高效(尤其數據量大時)。
字典推導式是Python中處理字典生成的利器,掌握它能讓你的代碼更簡潔、更專業。建議初學者多練習從簡單列表生成字典,再逐步嘗試帶條件過濾和複雜表達式的場景,很快就能熟練運用啦!