高估自己了?Python 字典這6個使用技巧著實(shí)太妙!
關(guān)注"Python學(xué)習(xí)與數(shù)據(jù)挖掘"
設(shè)為“置頂或星標(biāo)”,第一時間送達(dá)干貨
Python 的優(yōu)點(diǎn)之一是字典可以與 JSON 對象無縫集成,這使得字典數(shù)據(jù)結(jié)構(gòu)的使用比其他編程語言更頻繁。
在這篇文章中,我將介紹 6 個關(guān)于 Python 字典的技巧,相信如果你以前不知道這些技巧,你會從中受益。喜歡本文點(diǎn)贊、收藏、關(guān)注
1、按值對字典數(shù)組進(jìn)行排序
我們從一些 Web API 接收 JSON 對象數(shù)組是很常見的。假設(shè)我們已經(jīng)在 Python 列表中讀取了它們。現(xiàn)在我們要按照里面的某個值對這些字典進(jìn)行排序。
通常,當(dāng)我們想要對列表進(jìn)行排序時,sorted() 函數(shù)將非常容易使用。但是,這一次我們要根據(jù)它包含的字典對象的值對列表進(jìn)行排序。事實(shí)上, sorted() 函數(shù)有一個參數(shù)叫做 key。
讓我們首先創(chuàng)建一個字典列表。假設(shè)我們想按人們的年齡對字典進(jìn)行排序。
students?=?[
????{'name':?'Alice',?'age':?40},
????{'name':?'Bob',?'age':?37},
????{'name':?'Chris',?'age':?33}
]
然后,我們可以這樣創(chuàng)建一個函數(shù):
def?get_age(dict_item):
????return?dict_item['age']
現(xiàn)在,我們可以在 sorted() 函數(shù)中使用 get_age 函數(shù)
sorted(students,?key=get_age)
我們可以看到 get_age() 函數(shù)非常簡單,我們可以將它簡稱為 lambda 函數(shù)。
sorted(students,?key=lambda?item:?item['age'],?reverse=True)

在上面的例子中,我們使用 lambda 編寫了一個內(nèi)聯(lián)函數(shù)。
我們展開按 key 排序的用法
雖然這不適用于字典,但我只想展示 sorted()函數(shù)的擴(kuò)展用法。假設(shè)我們有一個字符串列表如下
strings?=?[
????'aaa3',
????'bbb2',
????'ccc1',
????'ddd5'
]
如果我們使用 sorted() 函數(shù)對其進(jìn)行排序,則必須基于每個字符串的首字母。因此,不應(yīng)更改順序。
但是,如果我們想根據(jù)最后一位數(shù)字對列表進(jìn)行排序怎么辦?我們可以編寫一個 lambda 函數(shù)來獲取字符串的最后一個字符。
2、按鍵或值對字典進(jìn)行排序
my_dict?=?{'c':?1,?'b':?2,?'a':?3}
在 Python 3.6 之前,不要為此煩惱,因?yàn)樽值涫菬o序?qū)崿F(xiàn)的。換句話說,我們只能對字典進(jìn)行排序并按順序打印。這可以在 for 循環(huán)中輕松完成。如果項目的順序很重要,我們需要使用 Ordered Dictionary。
from?collections?import?OrderedDict
my_ordered_dict?=?OrderedDict(sorted(my_dict.items()))

但是從 Python 3.6 開始,字典將具有順序,這意味著對字典進(jìn)行排序開始變得有意義。如果我們想按字典的鍵對字典進(jìn)行排序,我們可以簡單地使用 sorted() 函數(shù)對項目進(jìn)行排序,然后將它們轉(zhuǎn)換回字典。
按字典值排序
如果我們想按值對字典進(jìn)行排序,我們將需要再次使用從前面的問題中得到的技巧。那就是使用 sorted() 函數(shù)的關(guān)鍵參數(shù)。
dict(sorted(my_dict.items(),?key=lambda?item:?item[1]))
由于字典的 items() 將返回元組,我們可以使用訂閱 [1] 訪問它的第二個元素,這將是值。
3、使用推導(dǎo)創(chuàng)建字典
當(dāng)我們想用 for 循環(huán)創(chuàng)建一個邏輯簡單的字典時,使用字典推導(dǎo)可以非常簡潔高效。
例如,我們想使用 sqaure_x 作為鍵,其中 x 是一個數(shù)字,那么這個值應(yīng)該是對應(yīng)值的平方。我們可以使用帶有 range() 函數(shù)的 for 循環(huán)來獲取數(shù)字序列,然后按如下方式創(chuàng)建字典。
4、將兩個列表拼接成字典
有時,我們可能會分別獲取鍵和值。兩個能夠?qū)⒔邮盏降牧斜矸葱蛄谢癁樽值湟怨┮院笫褂茫覀儽仨殞⑺鼈兤唇釉谝黄稹?/p>
通常我們可以使用 for 循環(huán),本文分享一個更好的方法,它非常 Pythonic。
keys?=?['name',?'age',?'skill']
values?=?['Chris',?33,?'Python']
my_dict?=?dict(zip(keys,?values))

使用 zip() 函數(shù)還有更多好處。例如,如果我們有兩個長度不同的列表,多余的項目將被忽略。
keys?=?['name',?'age',?'skill']
values?=?['Chris',?33,?'Python',?'English']
my_dict?=?dict(zip(keys,?values))

在上面的示例中,第二個列表中的字符串"English"被忽略了,因?yàn)樗鼪]有對應(yīng)的鍵。
如果我們知道列表長度應(yīng)該嚴(yán)格相同,我們也可以強(qiáng)制執(zhí)行。所以,如果兩個列表的長度不同,就會拋出錯誤。請注意,此嚴(yán)格標(biāo)志是在 Python 3.10 中添加的。

5、合并兩個字典
合并兩個或多個字典可能是非常頻繁的操作,它最棘手的是在不同的 Python 版本中使用不同的方法。
在 Python 3.4 或更低版本中
我們可以使用字典的 update() 函數(shù)。它會將另一個字典附加到當(dāng)前字典。
但是,缺點(diǎn)是第一個字典 my_dict1 被修改了。如果我們想保留兩個原始字典,我們必須創(chuàng)建第三個。
從 Python 3.5 開始,它將用于解壓列表的星號 *list 語法擴(kuò)展為使用雙星號 **dictioanry 解壓字典。
因此,我們可以創(chuàng)建一個新字典,并將其中的兩個原始字典解包。

從 Python 3.9 開始
在 Python 3.9 中,涉及到一種新語法,即使用管道 | 合并兩個字典。
6、更改密鑰的名稱
如果我們想更改密鑰的名稱怎么辦?假設(shè)我們從一個 API 接收到 JSON 對象,但是鍵名與我們在數(shù)據(jù)庫中的不一致。因此,在將對象保存到數(shù)據(jù)庫之前,我們需要更改鍵的名稱。
請不要寫一個for循環(huán)來查找有key的item,除非有很多key需要按照一定的規(guī)則改變。相反,一種簡單的方法是使用簡單地將值傳遞給新項目,然后刪除舊項目。
執(zhí)行上述示例后,鍵"skill"已更改為"programming_language"。這是實(shí)現(xiàn)這一點(diǎn)的最直觀的方法。但是,我們甚至可以通過使用字典的 pop() 函數(shù)來簡化它。
這個想法是在字典中創(chuàng)建一個新鍵并從彈出的舊鍵值對中獲取值。之后,用舊值創(chuàng)建新鍵,舊鍵值對已經(jīng)消失。

總結(jié)
字典是 Python 中最重要的數(shù)據(jù)結(jié)構(gòu)之一。因此,知道一些技巧來做一些頻繁的操作是非常重要的,這些技巧不僅可以節(jié)省我們重新發(fā)明輪子的時間,還可以提供更高的性能。
長按或掃描下方二維碼,后臺回復(fù):加群,即可申請入群。一定要備注:來源+研究方向+學(xué)校/公司,否則不拉入群中,見諒!
(長按三秒,進(jìn)入后臺)
推薦閱讀

