多個字典或對映,希望在邏輯上將它們組合成單個對映以執行某些操作,例如查詢值或檢查鍵是否存在。
假如現在有兩個字典物件a,b。
a =
b =
假如現在要檢查某一鍵是否在其中乙個字典物件中存在。首先檢查a,若a中不存在,則檢查b。可以使用collections模組的chainmap類,如下:
from collections import chainmap
c = chainmap(a, b)
print(c['x']) # outputs 1 (from a)
print(c['y']) # outputs 2 (from b)
print(c['z']) # outputs 3 (from a)
chainmap採用多個對映並使它們在邏輯上顯示為乙個對映。 但是,對映並不是字面上合併在一起的。 相反,chainmap保留乙個底層對映的列表,並重新定義常用字典操作以掃瞄列表。 大多數操作都可以:
>>> len(c)
3>>> list(c.keys())
['x', 'y', 'z']
>>> list(c.values())
[1, 2, 3]
>>>
如果有重複的鍵,則chainmap物件例項只會獲取第乙個字典的鍵對應的值。因為'z'在a和b中都有出現,但獲取c['z']時,得到的只會是3,而不是4。
修改chainmap物件的操作只會影響到其第乙個字典中的相關資料。如下:
>>> c['z'] = 10
>>> c['w'] = 40
>>> del c['x']
>>> a
>>> del c['y']
traceback (most recent call last):
...>>>
當使用範圍值(例如程式語言中的變數(即全域性,本地等))時,chainmap特別有用。 事實上,有一些方法可以簡化:
>>> values = chainmap()
>>> values['x'] = 1
>>> values = values.new_child()
>>> values['x'] = 2
>>> values = values.new_child()
>>> values['x'] = 3
>>> values
chainmap(, , )
>>> values['x']
3>>> values = values.parents
>>> values['x']
2>>> values = values.parents
>>> values['x']
1>>> values
chainmap()
>>>
作為chainmap的替代方法,可以考慮使用update()方法將字典合併在一起。 例如:
>>> a =
>>> b =
>>> merged = dict(b)
>>> merged.update(a)
>>> merged['x']
1>>> merged['y']
2>>> merged['z']
3>>>
這通常可以實現,但該方案需要建立乙個單獨的字典物件,或破壞性的改變已存在的字典物件。而且,如果其中原有的字典物件被修改,這種修改並不會反映到合併後的物件,即合併的物件是新的物件,和原有的a或b沒有關聯。
>>> a['x'] = 13
>>> merged['x']
1
chainmap使用原始字典,因此它沒有此現象。
>>> a =
>>> b =
>>> merged = chainmap(a, b)
>>> merged['x']
1>>> a['x'] = 42
>>> merged['x'] # notice change to merged dicts
42>>>
Python 多個字典組合成單個字典
多個字典或對映,希望在邏輯上將它們組合成單個對映以執行某些操作,例如查詢值或檢查鍵是否存在。假如現在有兩個字典物件a,b。a b 假如現在要檢查某一鍵是否在其中乙個字典物件中存在。首先檢查a,若a中不存在,則檢查b。可以使用collections模組的chainmap類,如下 from collec...
將多個對映組合成單個對映
多個字典或對映,希望在邏輯上將它們組合成單個對映以執行某些操作,例如查詢值或檢查鍵是否存在。假如現在有兩個字典物件a,b。a b 假如現在要檢查某一鍵是否在其中乙個字典物件中存在。首先檢查a,若a中不存在,則檢查b。可以使用collections模組的chainmap類,如下 from collec...
將兩個列表組合成乙個字典 join 函式
list name tall list1 liyue boy 190cm dict zip list,list1 函式 string.join python中有join 和os.path.join 兩個函式,具體作用如下 join 連線字串陣列。將字串 元組 列表中的元素以指定的字元 分隔符 連線生...