官术网_书友最值得收藏!

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代替手動實現。

主站蜘蛛池模板: 安徽省| 南川市| 漠河县| 库车县| 安徽省| 洪江市| 都匀市| 开平市| 桂林市| 垫江县| 盈江县| 潼关县| 新竹市| 阿尔山市| 辽宁省| 博兴县| 木里| 辽阳县| 凤城市| 玉溪市| 通许县| 灵寿县| 华池县| 平南县| 宣武区| 镇原县| 济宁市| 霍山县| 屏边| 清涧县| 咸丰县| 治多县| 云阳县| 江城| 集贤县| 卫辉市| 井陉县| 增城市| 富川| 嫩江县| 佛山市|