- Python進階編程:編寫更高效、優雅的Python代碼
- 劉宇宙 謝東 劉艷
- 673字
- 2021-04-30 12:39:44
3.2.2 字典映射
在實際應用中,一個鍵對應一個值的映射不能滿足所有需求,有時需要通過一個關鍵值獲取多個值,即一個鍵對應多個值。
字典是一個鍵對應單值的映射。如果想要一個鍵映射多個值,只需將多個值放到另外的容器中,比如列表或者集合里,再通過一個鍵獲取該列表或集合即可。比如,可以像下面這樣構造對應的字典:
exp_dict_1 = { 'a': [1, 3, 5], 'b': [2, 4] } exp_dict_2 = { 'a': {'a', 'b', 'c'}, 'b': {'c', 'd'} } exp_dict_3 = { 'a': {'b': '1'}, 'b': {'c': 2} }
選擇使用列表還是集合取決于實際應用需求。
如果想保持元素的插入順序就應該使用列表;如果想去掉重復元素可以使用Set集合,但Set集合不保證元素的順序;使用字典可以去掉重復的key,字典也是無序的。不過,collections模塊中提供了一個OrderedDict類,該類可以保證字典的順序。
我們可以使用collections模塊中的defaultdict來構造字典。defaultdict的一個特征是它會自動初始化每個key剛開始對應的值,我們只需要關注添加元素的操作,示例如下:
from collections import defaultdict default_dict = defaultdict(list) default_dict['a'].append(1) default_dict['b'].append(3) default_dict = defaultdict(set) default_dict['a'].add(1) default_dict['b'].add(2)
注意 defaultdict會自動為將要訪問的鍵(就算目前字典中并不存在這樣的鍵)創建映射實體。如果不需要這樣的特性,可以在一個普通的字典上使用setdefault()方法來代替,示例如下:
d_dict = dict() d_dict.setdefault('a', []).append(1) d_dict.setdefault('b', []).append(2)
不過,很多程序員覺得setdefault()方法用起來有點別扭,因為每次調用都得創建一個新的初始值的實例(如示例中的空列表[])。
一般來講,創建一個多值映射字典是很簡單的。但如果選擇自己實現,值的初始化編寫代碼會更多,并且可讀性會降低。我們可以使用如下方式編寫代碼:
# 原始手動方式 define_dict = dict() for key, value in key_value_items: if key not in define_dict: define_dict[key] = [] define_dict[key].append(value)
使用defaultdict精簡后代碼如下:
# 改進實現方式 define_dict = defaultdict(list) for key, value in key_value_items: define_dict[key].append(value)
由示例代碼可見,使用defaultdict后,代碼量少,代碼更具可讀性。所以,建議讀者在工作中盡量用defaultdict代替手動實現。
推薦閱讀
- 在最好的年紀學Python:小學生趣味編程
- NLTK基礎教程:用NLTK和Python庫構建機器學習應用
- Magento 2 Development Cookbook
- Java Web程序設計
- Visual Basic程序設計與應用實踐教程
- Effective Python Penetration Testing
- Microsoft System Center Orchestrator 2012 R2 Essentials
- Mastering Python Networking
- 嚴密系統設計:方法、趨勢與挑戰
- SAP BusinessObjects Dashboards 4.1 Cookbook
- Learning SciPy for Numerical and Scientific Computing(Second Edition)
- Go語言入門經典
- Learning D
- UI動效設計從入門到精通
- Java Web開發基礎與案例教程