Python 合并多個(gè)字典或映射

合并多個(gè)字典或映射


ChainMap

假設(shè)有多個(gè)字典或者映射署浩,需求是將這些字典或者映射扮休,從邏輯上合并為一個(gè)單一的映射后執(zhí)行其他操作蔗怠,例如查找值或者檢查某些鍵是否存在。

假如有如下兩個(gè)字典:

>>> a = {'x': 1, 'z':3}
>>> b = {'y': 2, 'z': 4}

假設(shè)現(xiàn)在的需求是在兩個(gè)字典中執(zhí)行查詢操作它匕,先在字典 a 中查找刀脏,若查詢無結(jié)果,再在 b 中查找超凳。這里有個(gè)解決方案就是使用 collections 模塊中提供的 ChainMap 類愈污。示例如下:

>>> from collections import ChainMap
>>> c = ChainMap(a, b)
>>> c['x']  # 從 a 中輸出
1
>>> c['y']  # 從 b 中輸出
2
>>> c['z']  # 從 a 中輸出
3

ChainMap 作用是將多個(gè)字典或者其他映射組合在一起,創(chuàng)建一個(gè)單獨(dú)的可更新的視圖轮傍。這里的意思是暂雹,原多個(gè)字典并非真的合并在一起,是 ChainMap 類在內(nèi)部創(chuàng)建一個(gè)容納這些字典列表创夜,同時(shí)重新定義一些常見的字典操作來遍歷這個(gè)列表杭跪。以下是使用 ChainMap 后的一部分字典操作:

>>> len(c)
3
>>> list(c.keys())
['z', 'y', 'x']
>>> list(c.values())
[3, 2, 1]

這里特別提及下,如果出現(xiàn)重復(fù)鍵驰吓,會(huì)返回第一次出現(xiàn)的映射值涧尿。因此,上面例子中檬贰, c['z'] 返回的值總是對(duì)應(yīng)字典 a姑廉,而不是字典 b

同時(shí)翁涤,對(duì)于字典的更像或者刪除操作也同樣是影響列表中的第一個(gè)字典桥言。示例如下:

>>> c['z'] = 10
>>> c['w'] = 60
>>> del c['x']
>>> a
{'z': 10, 'w': 60}
>>> del c['y']
Traceback (most recent call last):
...
KeyError: "Key not found in the first mapping: 'y'"

new_child() 和 parents


ChainMap 還有個(gè) new_child 方法和 parents 屬性。

下面是兩者的一些使用方法:

>>> values = ChainMap()
>>> values['x'] = 1
>>> # 添加一個(gè)新的映射
... values = values.new_child()
>>> values['x'] = 2
>>> # 添加一個(gè)新的映射
... values = values.new_child()
>>> values['x'] = 3
>>> values
ChainMap({'x': 3}, {'x': 2}, {'x': 1})
>>> values['x']
3
>>> # 丟棄映射
... values = values.parents
>>> values['x']
2
>>> values = values.parents
>>> values['x']
1
>>> values
ChainMap({'x': 1})

從上面的例子中可以看到葵礼,new_child() 方法返回一個(gè)新的 ChainMap 類号阿,包含一個(gè)新映射,后面跟隨當(dāng)前實(shí)例的全部映射鸳粉。這個(gè)方法用于創(chuàng)建子上下文扔涧,不改變?nèi)魏胃赣成涞闹怠?/p>

parents 屬性返回一個(gè)新的 ChainMap 包含所有的當(dāng)前實(shí)例的映射,除了第一個(gè)届谈。這樣可以在搜索的時(shí)候跳過第一個(gè)映射枯夜。

作為 ChainMap 的替代,可以考慮 update() 方法將兩個(gè)字典合并疼约,示例如下:

>>> a = {'x': 1, 'z': 3}
>>> b = {'y': 2, 'z': 4}
>>> merged = dict(b)
>>> merged.update(a)
>>> merged['x']
1
>>> merged['y']
2
>>> merged['z']
3
>>>

update() 方法同樣能夠?qū)崿F(xiàn)需求卤档,但是蝙泼,它需要新建一個(gè)完全不同的字典對(duì)象(或者破壞現(xiàn)有的字典結(jié)構(gòu))程剥,還有一點(diǎn)是,原字典所做的更像,不會(huì)反應(yīng)到新的字典中织鲸。示例如下:

>>> a['x'] = 13
>>> merged['x']
1

對(duì)字典 a 中的 x 進(jìn)行更改舔腾,合并后的字典并沒有發(fā)生改變。

ChainMap 使用原來的字典搂擦,它自己不創(chuàng)建新的字典稳诚。所以不會(huì)出現(xiàn)上面的情況,示例如下:

>>> a = {'x': 1, 'z': 3}
>>> b = {'y': 2, 'z': 4}
>>> merged = ChainMap(a, b)
>>> merged['x']
1
>>> a['x'] = 13
>>> merged['x']  # 這里可以注意到用 ChainMap 合并的字典瀑踢,值同樣發(fā)生了改變
13

以上就是本篇的主要內(nèi)容扳还。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市橱夭,隨后出現(xiàn)的幾起案子氨距,更是在濱河造成了極大的恐慌,老刑警劉巖棘劣,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俏让,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡茬暇,警方通過查閱死者的電腦和手機(jī)首昔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來糙俗,“玉大人勒奇,你說我怎么就攤上這事∏缮В” “怎么了撬陵?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)网缝。 經(jīng)常有香客問我巨税,道長(zhǎng),這世上最難降的妖魔是什么粉臊? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任草添,我火速辦了婚禮,結(jié)果婚禮上扼仲,老公的妹妹穿的比我還像新娘远寸。我一直安慰自己,他們只是感情好屠凶,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布驰后。 她就那樣靜靜地躺著,像睡著了一般矗愧。 火紅的嫁衣襯著肌膚如雪灶芝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音夜涕,去河邊找鬼犯犁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛女器,可吹牛的內(nèi)容都是我干的酸役。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼驾胆,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼涣澡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起丧诺,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤暑塑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后锅必,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體事格,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年搞隐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了驹愚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡劣纲,死狀恐怖逢捺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情癞季,我是刑警寧澤劫瞳,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站绷柒,受9級(jí)特大地震影響志于,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜废睦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一伺绽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嗜湃,春花似錦奈应、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至刚陡,卻和暖如春惩妇,著一層夾襖步出監(jiān)牢的瞬間株汉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工屿附, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留郎逃,地道東北人哥童。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓挺份,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親贮懈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子匀泊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359