01
引言
Python是我最喜歡的編程語言之一,它向來以其簡單性、多功能性和可讀性而聞名。
字典作為Python中最常使用的數據類型,大家幾乎每個人都或多或少在項目中使用過字典,但是字典里有一些潛在的技巧可能并不是每個同學都會用到。
在本文中,我們將深入探討七個關于字典的使用技巧,希望可以幫助到大家!
02
初始化技巧
如果讓大家創建一個字典,大家可能80%都會直接選擇{}來進行創建,代碼示例如下:
# normal way of creating a dictionary`` ``d = {'apple':4, 'orange':5, 'pear':6, 'pineapple':7}
這里推薦大家直接使用 dict(key=value)的方式來創建字典,代碼如下:
# 'better' way to creating same dictionary`` ``d = dict(apple=4, orange=5, pear=6, pineapple=7)
雖然兩者實現了相同的功能,但是為什么第二種方式更好呢?
-
使用 {} 創建字典時,我們需要在字符串的鍵上加上引號來說明我們key的數據類型為字符串;由于我們有很多元素,所以我們就需要不斷輸入新的引號;而我們第二種方式下,則不需要輸入引號。
-
dict方法不適用于非字符串的鍵,因此這兩種方式都有其具體使用的場合。
03
字典合并
這里推薦大家使用解包符號******來進行兩個字典的合并,代碼如下:
# here are 2 dicts``a = {1:1, 2:2}``b = {3:3, 4:4}`` ``# we can combine them using **``x = {**a, **b}``print(x) # {1:1, 2:2, 3:3, 4:4}
上述代碼中的 ** 會將鍵值對解包到父字典中,我們也可以在組建新字典的時候添加新的鍵值對,代碼如下:
# we can add normal key-value pairs too``a = {1:1, 2:2}``b = {3:3, 4:4}`` ``x = {**a, **b, 5:5}``print(x) # {1:1, 2:2, 3:3, 4:4, 5:5}
04
字典作為函數參數傳遞
我們可以使用**將字典作為函數關鍵字參數進行傳遞,我們來舉個簡單的例子,一般的函數調用如下:
# a function that takes in a, b, c`` ``def test(a, b, c):` `print(a, b, c)`` ``test(a=1, c=2, b=3) # 1 3 2
我們也可以將包含key為 a、b 和 c 的字典動態地傳入該函數,如下:
mydict = dict(a=1, b=2, c=3)``print(mydict) # {'a':1, 'b':2, 'c':3}`` ``# this is the same as test(a=1, b=2, c=3)``test(**mydict) # 1 2 3
上述代碼中,我們使用 ** 進行字典解包,并將解包后相應的參數傳遞給對應的函數。
?
05
字典生成式
假設我們要創建以下字典 {1:1, 2:4, 3:9, 4:16},代碼如下:
# normal way to create this`` ``d = {}``for i in range(1, 5):` `d[i] = i**2`` ``print(d) # {1: 1, 2: 4, 3: 9, 4: 16}
使用字典生成式的代碼如下:
# dict comprehension way to create this`` ``d = {i:i**2 for i in range(1, 5)}`` ``print(d) # {1:1, 2:4, 3:9, 4:16}
這兩種方法都是正確和合法的。但要注意的是,字典生成式理解起來要優雅得多、讀起來也容易得多。
我們再來看個嵌套字典的例子,一般寫法如下:
# nested for loops`` ``d = {}``for i in range(2):` `for j in range(2, 4):` `d[(i,j)] = 0`` ``print(d)`` ``# {(0, 2): 0, (0, 3): 0, (1, 2): 0, (1, 3): 0}
更優雅的寫法如下:
# nested for loops in dict comprehension`` ``d = {(i,j):0 for i in range(2) for j in range(2, 4)}`` ``print(d)`` ``# {(0, 2): 0, (0, 3): 0, (1, 2): 0, (1, 3): 0}
06
獲取默認值
當我們訪問一個不存在的鍵時,我們會得到 KeyError,如下:
d = {1:1, 2:2, 3:3}`` ``print(d[1]) # 1``print(d[4]) # KeyError
如果我們真的不希望出現 KeyError,則推薦使用字典中的get() 方法,如果鍵不存在,則返回 None。
# using .get()`` ``d = {1:1, 2:2, 3:3}`` ``print(d.get(1)) # 1``print(d.get(4)) # None
注意到上述代碼中,我們得到的不是KeyError,而是None。
更進一步,我們也可以指定返回的默認值,代碼如下:
# .get() but with custom default value`` ``d = {1:1, 2:2, 3:3}`` ``print(d.get(1, 100)) # 1``print(d.get(4, 100)) # 100``print(d.get(9, 100)) # 100
07
使用元組列表來創建字典
假設我們有以下元組構成的列表,示例如下:
# a list of tuples (of length 2)`` ``ls = [('apple', 4), ('orange', 5), ('pear', 6)]
則可使用以下技巧生成字典,代碼如下:
# we can pass this into dict() to create a dict`` ``d = dict(ls)``print(d) # {'apple': 4, 'orange': 5, 'pear': 6}
這對快速從元組創建字典非常有用,無需編寫字典生成式。
08
遍歷字典
假設我們有以下字典,如下:
# a dict``d = dict(apple=4, orange=5, pear=6)`` ``print(d) # {'apple':4, 'orange':5, 'pear':6}
當我們遍歷 dict 本身時,我們則會生成所有 dict的鍵:
for k in d:` `print(k)`` ``# apple``# orange``# pear
同時,我們也可以使用函數values()來訪問字典dict中所有的值,如下:
for v in d.values():` `print(v)`` ``# 4``# 5``# 6
此外,如果我們使用函數items(),則鍵和值都會生成一個元組,如下:
for k,v in d.items():` `print(k, v)`` ``# apple 4``# orange 5``# pear 6
我自己認為函數items() 是最有用的方法,可以快速遍歷字典中的所有鍵值對。
09
總結
本文介紹了Python中字典的七種有趣小技巧,使用這些技巧,可以快速提升大家的編碼能力。
您學廢了嗎?