字典是 Python 中強大的內(nèi)置數(shù)據(jù)結(jié)構(gòu),可將數(shù)據(jù)存儲為鍵值對。字典理解對于從現(xiàn)有字典和可迭代對象創(chuàng)建新字典非常有幫助。在本教程中,我們將通過編寫一些簡單的示例來了解字典推導(dǎo)式在 Python 中的工作原理。
什么是 Python 中的字典?
Python 中的字典允許我們存儲兩組值之間的一系列映射,即鍵和值。
- 字典中的所有項目都包含在一對花括號內(nèi){}。
- 字典中的每一項都是鍵和值之間的映射——稱為鍵值對。
- 鍵值對通常稱為字典項。
- 您可以使用相應(yīng)的鍵訪問這些值。
這是字典的一般示例:
my_dict = {"key1":<value1>,"key2":<value2>,"key3":<value3>,"key4":<value4>}
在上面的例子中,
- 字典my_dict包含 4 個鍵值對(項目)。
- "key1"通過"key4"是4個鍵。
- 您可以使用my_dict["key1"]to access <value1>、my_dict["key2"]to access<value2>等。
現(xiàn)在我們知道了 Python 字典是什么,讓我們繼續(xù)學(xué)習(xí)字典理解。
如何使用字典理解從可迭代對象創(chuàng)建 Python 字典
在本節(jié)中,讓我們使用字典理解從可迭代對象(例如列表或元組)創(chuàng)建 Python 字典。
如果我們選擇動態(tài)生成鍵或值,我們可以只使用一個可迭代對象來創(chuàng)建一個新的 Python 字典。
當(dāng)我們選擇動態(tài)生成值時,我們可以使用迭代中的項目作為鍵,反之亦然。
一般語法如下所示。請注意 <> 之間的名稱是實際變量名稱的占位符。
<dict_name> = {<new_key>:<new_value> for <item> in <iterable>}
讓我們解析上面的語法。
- {} 表示我們正在填充字典。
- 對于迭代中的每個項目,我們在字典中生成一個鍵值對。
? 是時候舉個簡單的例子了。
Python 詞典理解 - 示例 1
假設(shè)我們有一個訪問我們商店的客戶列表,我們想為每個客戶提供隨機折扣。我們希望折扣值介于 1 美元到 100 美元之間。
在 Python 中,random.randint(i,j)返回i和之間的隨機整數(shù)j,其中兩個端點都包含在內(nèi)。
因此,我們可以使用randint()Python 的 random 模塊中的函數(shù)為列表中的每個客戶生成 $1 到 $100 之間的折扣。
下面的代碼片段展示了我們?nèi)绾蝑iscount_dict從客戶列表中創(chuàng)建一個新字典。
import random
customers = ["Alex","Bob","Carol","Dave","Flow","Katie","Nate"]
discount_dict = {customer:random.randint(1,100) for customer in customers}
print(discount_dict)
#Output
{'Alex': 16, 'Bob': 26, 'Carol': 83, 'Dave': 21, 'Flow': 38, 'Katie': 47, 'Nate': 89}
上面的示例執(zhí)行以下操作:
- 循環(huán)遍歷客戶列表 ( customers),
- 使用每個客戶的姓名作為鍵,并且
- 生成 1 美元到 100 美元之間的隨機折扣作為密鑰的值。
如何使用字典理解從兩個可迭代對象創(chuàng)建 Python 字典
如果我們已經(jīng)有包含鍵和值的預(yù)定義可迭代對象怎么辦?假設(shè)您有兩個列表,list_1并且list_2–list_1包含鍵和list_2相應(yīng)的值。
我們現(xiàn)在可以使用 Python 的zip()函數(shù)來壓縮這兩個列表以生成鍵值對。
注意:該zip函數(shù)接受一系列可迭代對象作為參數(shù),并返回一個元組迭代器,如下圖所示。
所以,第一個元組是第一個鍵值對,第二個元組是第二個鍵值對,一般來說,第i個元組是第i個鍵值對。
在這種情況下,字典理解采用以下形式:
<dict_name> = {<new_key>:<new_value> for (key,value) in zip(list1,list2)}
解析上述語法非常簡單。
- 鍵和值可作為元組使用,因為我們已使用該zip()函數(shù)將它們壓縮在一起。
- 現(xiàn)在,我們遍歷這個元組迭代器來獲取字典的鍵值對。
? 是時候看另一個快速示例了。
Python 詞典理解 - 示例 2
假設(shè)我們想創(chuàng)建一個我們城市每周溫度的字典。天數(shù)應(yīng)該是鍵,與天數(shù)對應(yīng)的溫度(攝氏度)應(yīng)該是值。
假設(shè)我們有兩個列表中的天數(shù)和溫度,如下所示。
days = ["Sunday", "Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]
temp_C = [30.5,32.6,31.8,33.4,29.8,30.2,29.9]
我們現(xiàn)在可以繼續(xù)使用字典理解來創(chuàng)建每周溫度的字典。
# Creating a dictionary of weekly tempertaures
# from the list of temperatures and days
weekly_temp = {day:temp for (day,temp) in zip(days,temp_C)}
print(weekly_temp)
# Output
{'Sunday': 30.5, 'Monday': 32.6, 'Tuesday': 31.8, 'Wednesday': 33.4, 'Thursday': 29.8, 'Friday': 30.2, 'Saturday': 29.9}
在上面的示例中,我們使用該zip()函數(shù)將日期和溫度列表壓縮在一起。我們現(xiàn)在可以通過使用任何一天作為鍵來訪問字典來獲取當(dāng)天的溫度,如下所示:
weekly_temp["Thursday"]
# Output
29.8
如何在 Python 字典上使用 items() 方法
到目前為止,我們已經(jīng)看到了如何使用鍵來訪問值。我們?nèi)绾卧L問字典中的所有鍵值對?
為此,我們可以調(diào)用items()字典上的方法來獲取所有鍵值對,如下面的代碼片段所示。
discount_dict.items()
# Output
dict_items([('Alex', 16), ('Bob', 26), ('Carol', 83), ('Dave', 21), ('Flow', 38), ('Katie', 47), ('Nate', 89)])
如何使用字典理解從現(xiàn)有字典創(chuàng)建 Python 字典
假設(shè)我們已經(jīng)有一個 Python 字典。
但是,我們想創(chuàng)建一個新字典,其中僅包含我們字典中滿足特定條件的項目。字典理解在這方面非常方便。
<dict_name> = {<new_key>:<new_value> for (key,value) in <dict>.items() if <condition>}
讓我們解析上面的語法。我們使用該items()方法并獲取現(xiàn)有字典中的所有鍵值對。
- 我們訪問第一個字典項,并檢查condition計算結(jié)果是否為 True。
- 如果條件為True,我們將第一項添加到我們的新字典中。
- 然后我們對現(xiàn)有字典中的所有項目重復(fù)這些步驟。
? 讓我們舉一個例子來看看這是如何工作的。
Python 詞典理解 - 示例 3
讓我們以之前創(chuàng)建discount_dict字典的折扣示例為基礎(chǔ)。讓我們discount_dict再看看我們的字典。
{'Alex': 16, 'Bob': 26, 'Carol': 83, 'Dave': 21, 'Flow': 38, 'Katie': 47, 'Nate': 89}
我們看到一些客戶很幸運地獲得了比其他客戶更高的折扣。讓我們解決這種差異,讓我們所有的客戶都滿意。
我們現(xiàn)在想為折扣低于 30 美元的客戶提供下次購買時 10% 的折扣。
在這種情況下,我們正在customer_10從我們的discount_dict字典中創(chuàng)建一個新字典。
customer_10 = {customer:discount for (customer, discount) in discount_dict.items() if discount<30}
print(customer_gifts)
# Output
{'Alex': 16, 'Bob': 26, 'Dave': 21}
上面的代碼執(zhí)行以下操作:
- 對于我們 中的每件商品discount_dict,它都會利用折扣的價值。
- 如果折扣低于 30 美元,它會將相應(yīng)的customer:discount一對添加到我們的新字典中customer_10。
請注意如何將Alex、Bob和Davewho 的折扣低于 30 美元添加到新詞典中。
結(jié)論
讓我們總結(jié)一下我們在本教程中學(xué)到的東西。我們已經(jīng)看到了如何使用 Dictionary Comprehension 從以下內(nèi)容創(chuàng)建 Python 詞典:
- 只有一個可迭代的,
- 兩個可迭代對象,以及
- 使用條件過濾項目的現(xiàn)有字典。
感謝您的閱讀。祝學(xué)習(xí)愉快!