將多個對映組合成單個對映

2021-10-04 00:19:49 字數 2129 閱讀 1675

多個字典或對映,希望在邏輯上將它們組合成單個對映以執行某些操作,例如查詢值或檢查鍵是否存在。

假如現在有兩個字典物件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...

Python 多個字典組合成單個字典

多個字典或對映,希望在邏輯上將它們組合成單個對映以執行某些操作,例如查詢值或檢查鍵是否存在。假如現在有兩個字典物件a,b。a b 假如現在要檢查某一鍵是否在其中乙個字典物件中存在。首先檢查a,若a中不存在,則檢查b。可以使用collections模組的chainmap類,如下 from collec...

如何將多個C語言模組組合成乙個程式

一般來說,我們編制的c語言源程式都是放在乙個擴充套件名為.c的檔案中,這對乙個較簡單的程式是合適的,但對於大型專案就不合適了,其一,大專案往往由多人合作完成,大家都來 操作同乙個檔案極易出錯 其二,大檔案的編譯 除錯都極為複雜 其三,如果兩個程式中都要用到同乙個自定義的函式,此函式須從一檔案移動到另...