九個(gè)令人相見恨晚的Python字典技巧,讓你寫出更優(yōu)雅、更Pythonic的代碼!
今天筆者將向大家分享9個(gè)令人相見恨晚的Python字典技巧,讓你更優(yōu)雅高效地處理字典,寫出更加Pythonic的代碼。
1. 使用 dict(key=value) 創(chuàng)建字典
通常,我們通過以下方式創(chuàng)建字典:
test_dict: dict = {'name': 'Jack Zhang', 'age': 23, 'city': 'San Francisco'}
但是我常用的是 dict(key=value) 的方式:
test_dict2: dict = dict(name='Jack Zhang', age=23, city='San Francisco')
這樣做的好處是:當(dāng)使用 {} 創(chuàng)建字典時(shí),對(duì)于字符串鍵,我們需要輸入引號(hào)符。如果處理的鍵很多,那么就需要輸入更多的引號(hào)符,這不僅效率低下,而且還很無聊。而使用 dict(key=value) 方式,則不需要輸入引號(hào)符,省去了我們很多無聊的工作,并且代碼更簡潔。
當(dāng)然,dict(key=value) 方式不適用于非字符串鍵,因此這兩種方式都有各自的用途,根據(jù)需求選擇最合適的方式即可。
2. 使用 ** 合并字典
dict1: dict = dict(name='Jack Zhang', age=23)
dict2: dict = dict(city='San Francisco', major='Software Engineering')
com_dict: dict = {**test_dict, **test_dict2}
print(f'com_dict: {com_dict}')
# com_dict: {'name': 'Jack Zhang', 'age': 23, 'city': 'San Francisco'}
字典前面的 ** 符號(hào)用于將鍵值對(duì)解包到目標(biāo)字典中。
3. 使用 ** 將字典作為參數(shù)傳遞
def personal_info(name: str, age: int, city: str) -> None:
print(f'Name: {name}, Age: {age}, City: {city}')
personal_info(name='Jack Zhang', age=23, city='San Francisco')
# Name: Jack Zhang, Age: 23, City: San Francisco
當(dāng)然,我們也可以動(dòng)態(tài)地將包含鍵 name, age 和 city 的字典傳遞給函數(shù):
personal_info(**test_dict)
# Name: Jack Zhang, Age: 23, City: San Francisco
字典前面的 ** 可以將字典的鍵值解包到函數(shù) personal_info 中。如果我們想要?jiǎng)討B(tài)地將關(guān)鍵字參數(shù)傳遞到函數(shù)中,這種方式很有用。
4. 字典推導(dǎo)式
假設(shè)我們想要?jiǎng)?chuàng)建字典:{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
有兩種方式:
- ① 常規(guī)方式——循環(huán)實(shí)現(xiàn):
num_pow: dict = {}
for num in range(1, 6):
num_pow[num] = num ** 2
print(f'num_pow: {num_pow}')
# {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
- ② 字典推導(dǎo)式實(shí)現(xiàn):
num_pow2: dict = {num: num ** 2 for num in range(1, 6)}
print(f'num_pow2: {num_pow2}')
# {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
雖然兩種方式都是正確且合法的方式,但請(qǐng)注意,字典推導(dǎo)式更加優(yōu)雅、Pythonic 且可讀性更強(qiáng)。
5. get(key, default_value) 獲取字典值
通常情況下,當(dāng)我們?cè)L問一個(gè)不存在的鍵時(shí),會(huì)得到 KeyError:
test_dict: dict = dict(name='Jack Zhang', age=23, city='San Francisco')
print(f"zipcode: {test_dict['zipcode']}")
# KeyError: 'zipcode'
如果我們不希望出現(xiàn) KeyError,那么可以使用 get() 方法,如果鍵不存在,該方法會(huì)返回 None:
print(f"zipcode: {test_dict.get('zipcode')}") # None
這個(gè)時(shí)候,我們就不會(huì)得到 KeyError,而是 None。此外,我們還可以設(shè)置默認(rèn)值(如果鍵不存在):
print(f"zipcode: {test_dict.get('zipcode', '110110')}")
# zipcode: 110110
6. 根據(jù)元組列表創(chuàng)建字典
lst_of_tuple: list[tuple[str, str]] = [('Jack Zhang', 'Male'), ('John', 'Male'), ('Elina', 'Female')]
people_dict: dict = dict(lst_of_tuple)
print(f'Personal informaiton: {people_dict}')
# Personal informaiton: {'Jack Zhang': 'Male', 'John': 'Male', 'Elina': 'Female'}
在實(shí)際項(xiàng)目中,如果需要通過上下文的元組列表創(chuàng)建字典,這種方式就非常有用。
7. values() 和 items() 方法
一般情況下,當(dāng)我們遍歷字典本身時(shí),我們得到的是字典的所有鍵:
for name in people_dict:
print(f'name: {name}')
# name: Jack Zhang
# name: John
# name: Elina
這等價(jià)于 .keys() 方法:
for name in people_dict.keys():
print(f'name: {name}')
# name: Jack Zhang
# name: John
# name: Elina
如果我們使用 .values() 方法,我們將生成字典的所有值:
for gender in people_dict.values():
print(f'gender: {gender}')
# gender: Male
# gender: Male
# gender: Female
然而,如果我們想要同時(shí)獲取字典的鍵值對(duì),則可以使用 .items() 方法:
for name, gender in people_dict.items():
print(f'name: {name}; gender: {gender}')
# name: Jack Zhang; gender: Male
# name: John; gender: Male
# name: Elina; gender: Female
8. setdefault() 方法
前面我們提到使用 get() 方法訪問不存在的字典鍵時(shí),不會(huì)得到 KeyError。其實(shí),還有另外一種方法 setdefault() 可以達(dá)到相同的目的。與前者的區(qū)別在于,setdefault() 方法還可以動(dòng)態(tài)修改字典,即當(dāng)字典鍵不存在時(shí),會(huì)向字典中增加新的鍵值對(duì)。
print(f'zipcode: {test_dict.get("zipcode", "110110")}')
print(test_dict)
print(f'zipcode: {test_dict.setdefault("zipcode", "110110")}')
print(test_dict)
使用 setdefault() 方法,我們可以輕易實(shí)現(xiàn)字符計(jì)數(shù):
info: str = 'Python is a very powerful programming language!'
char_count: dict = dict()
for char in info:
char_count[char] = char_count.setdefault(char, 0) + 1
print(char_count)
# {'P': 1, 'y': 2, 't': 1, 'h': 1, 'o': 3, 'n': 3, ' ': 6, 'i': 2, 's': 1, 'a': 4, 'v': 1, 'e': 3, 'r': 4, 'p': 2, 'w': 1, 'f': 1, 'u': 2, 'l': 2, 'g': 4, 'm': 2, '!': 1}
9. 可以作為字典鍵以及不能作為鍵的數(shù)據(jù)類型
通常:
- 不可變數(shù)據(jù)類型可以作為字典鍵,比如:int, str, tuple, bool。
- 可變數(shù)據(jù)類型則不可以作為字典鍵,比如:list, dict。
結(jié)論
今天的分享就到這啦!感謝你的閱讀,希望本文對(duì)你能有所幫助!