Python如何建立多個(gè)值和單個(gè)鍵的映射
問(wèn)題
你希望創(chuàng)建一個(gè)字典,該字典可以建立多個(gè)值和單個(gè)鍵之間的映射(即所謂的多值字典)。
解決方案
在 Python 中,基于普通的字典類(lèi) dict
創(chuàng)建的對(duì)象一般只可以存儲(chǔ)一個(gè)鍵和一個(gè)值的映射。
如果你希望存儲(chǔ)一個(gè)鍵和多個(gè)值之間的映射,你需要將多個(gè)值存儲(chǔ)存儲(chǔ)在另一個(gè)容器中,如:列表或集合。
例如,你可能會(huì)創(chuàng)建如下所示的字典:
d = { 'a': [1, 2, 3], 'b': [4, 5], } e = { 'a': {1, 2, 3}, 'b': {4, 5}, }
究竟是使用列表還是集合來(lái)保存多個(gè)值取決于實(shí)際需求,即如果你希望保持元素的插入順序,那么使用列表比較好;如果你希望去除重復(fù)元素且不在乎元素的插入順序,則使用集合更佳。
實(shí)際上,下面將看到,通過(guò)代碼的方式創(chuàng)建上述的字典還是比較麻煩的,需要考慮某個(gè)鍵是否已經(jīng)在字典中,并據(jù)此做不同的處理。
對(duì)此,標(biāo)準(zhǔn)模塊 collections
中的類(lèi) defaultdict
可以使得通過(guò)代碼創(chuàng)建類(lèi)似上述字典變得很容易,使用該類(lèi)創(chuàng)建的對(duì)象中,一個(gè)顯著的特點(diǎn)是,對(duì)于不存在的鍵,在第一次嘗試按照鍵添加值時(shí),該對(duì)象做好自動(dòng)的做好值的初始化。
例如:
>>> from collections import defaultdict >>> d = defaultdict(list) >>> d defaultdict(<class 'list'>, {}) >>> d['a'] [] >>> d defaultdict(<class 'list'>, {'a': []}) >>> d = defaultdict(list) >>> d['a'].append(1) >>> d['a'].append(2) >>> d['b'].append(4) >>> d defaultdict(<class 'list'>, {'a': [1, 2], 'b': [4]}) >>> d = defaultdict(set) >>> d['a'].add(1) >>> d['a'].add(2) >>> d['b'].add(4) >>> d defaultdict(<class 'set'>, {'a': {1, 2}, 'b': {4}})
討論
如上所述,如果使用普通的字典類(lèi) dict
創(chuàng)建對(duì)象實(shí)現(xiàn)和上述 defaultdict
類(lèi)創(chuàng)建對(duì)象類(lèi)似的功能,那么對(duì)于某個(gè)鍵第一個(gè)值的初始化就會(huì)比較麻煩。
例如,使用 dict
的初始化可能如下:
>>> pairs >>> [('a', 1), ('a', 2), ('a', 3), ('b', 4), ('b', 5)] >>> d = {} >>> for key, value in pairs: ... if key not in d: ... d[key] = [] ... d[key].append(value) >>> d {'a': [1, 2, 3], 'b': [4, 5]}
如果使用 defaultdict
,那么代碼就會(huì)很簡(jiǎn)潔:
>>> d = defaultdict(list) >>> for key, value in pairs: ... d[key].append(value) >d defaultdict(<class 'list'>, {'b': [4, 5], 'a': [1, 2, 3]})
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python中的 No Module named ***問(wèn)題及解決
這篇文章主要介紹了Python中的 No Module named ***問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07Python數(shù)據(jù)持久化存儲(chǔ)實(shí)現(xiàn)方法分析
這篇文章主要介紹了Python數(shù)據(jù)持久化存儲(chǔ)實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Python基于pymongo及mysql模塊的數(shù)據(jù)持久化存儲(chǔ)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-12-12Python?pandera數(shù)據(jù)驗(yàn)證和清洗的庫(kù)
為了確保數(shù)據(jù)的質(zhì)量,Python Pandera 庫(kù)應(yīng)運(yùn)而生。本文將深入介紹 Python Pandera,這是一個(gè)用于數(shù)據(jù)驗(yàn)證和清洗的庫(kù),并提供豐富的示例代碼,幫助大家充分利用它來(lái)提高數(shù)據(jù)質(zhì)量2024-01-01最基礎(chǔ)的Python的socket編程入門(mén)教程
這篇文章主要介紹了最基礎(chǔ)的Python的socket編程入門(mén)教程,包括最基本的發(fā)送和接受信息等內(nèi)容,需要的朋友可以參考下2015-04-04