Python合并兩個(gè)字典成一個(gè)新字典的幾種方法分析比較

Python合并兩個(gè)字典成一個(gè)新字典的幾種方法分析比較

兩個(gè)字典如下:

>>> d1 = {'name' : 'revotu', 'age' : 99}
>>> d2 = {'age' : 24, 'sex' : 'male'}

合并后的結(jié)果如下(即,key相同時(shí)后面字典值覆蓋前面字典):

>>> d
{'sex': 'male', 'name': 'revotu', 'age': 24}

首先令花,說明字典并不支持+加法運(yùn)算:

>>> d1 + d2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'dict' and 'dict'
>>>

現(xiàn)總結(jié)如下幾種方法以及簡要分析比較。

  1. 多次更新
    下面是最簡單的合并字典的方式:
>>> d = {}
>>> d.update(d1)
>>> d.update(d2)

首先創(chuàng)建一個(gè)空字典监氢,并使用update方法向字典中添加元素绎谦。注意,先添加的是d1定续,以保證后面添加的d2重復(fù)鍵會(huì)覆蓋d1谍咆。
此方法滿足了我們的要求,而且清晰明確私股,可是三行代碼總感覺不夠Pythonic摹察。

  1. 先復(fù)制,后更新
    先復(fù)制d1字典創(chuàng)建一個(gè)新字典倡鲸,然后使用d2來更新前面創(chuàng)建的新字典供嚎。
>>> d = d1.copy()
>>> d.update(d2)

對(duì)比方法一,這種復(fù)制d1的方法峭状,更明顯的表現(xiàn)出d1作為默認(rèn)值克滴。

  1. 字典構(gòu)造器
    還可以使用字典的構(gòu)造器dict()復(fù)制字典,然后再更新:
>>> d = dict(d1)
>>> d.update(d2)

與方法二很相似优床,但是沒有方法二直接明了劝赔。

  1. 關(guān)鍵字參數(shù)hack
    你可能見過下面這個(gè)巧妙的解決辦法:
>>> d = dict(d1 , **d2)

只有一行代碼,看上去很酷羔巢,但是有一個(gè)問題望忆,這種hack技巧只有在字典的鍵是字符串時(shí)才有效。

看上去很cool竿秆,但是不通用启摄,字典的鍵必須是字符串才可以用這種關(guān)鍵字參數(shù)方法。

  1. 字典推導(dǎo)式
    可以用字典推導(dǎo)式解決此問題:
>>> d = {k:v for d in [d1, d2] for k,v in d.items()}

字典推導(dǎo)式方法滿足要求幽钢,只是嵌套的字典推導(dǎo)式歉备,不那么清晰,不易于理解匪燕。

  1. 元素拼接
    我們從每個(gè)字典中獲取一個(gè)元素列表蕾羊,將列表拼接起來喧笔,然后再用拼接的列表構(gòu)造字典:
>>> d = dict(list(d1.items()) + list(d2.items()))

而且,d2的元素在列表后面龟再,所以在鍵重復(fù)時(shí)可以覆蓋d1书闸。如果在Python2中,items()方法本身返回的就是列表利凑,無需用list()轉(zhuǎn)成列表浆劲。

元素拼接在構(gòu)造字典可以滿足要求,只是看上去代碼有些重復(fù)哀澈。

  1. 元素并集
    在Python3中牌借,字典返回的是視圖對(duì)象,鍵的視圖對(duì)象是一個(gè)類似集合的對(duì)象割按,如果字典中的值可以保證是唯一的可哈希的膨报,此時(shí)items返回的視圖對(duì)象也是一個(gè)類似集合的對(duì)象:
    >>> d = dict(d1.items() | d2.items())

這種方法挺有意思,可是并不準(zhǔn)確适荣,因?yàn)榧鲜菬o序的现柠,鍵重復(fù)時(shí)不能保證誰覆蓋誰,而且字典中的值通常也是不可哈希的弛矛,當(dāng)然也就不能返回一個(gè)類似集合的對(duì)象晒旅。

  1. chain items
    目前為止,我們討論的解決方案中汪诉,最符合Python語言習(xí)慣而且只有一行代碼實(shí)現(xiàn)的,是創(chuàng)建兩個(gè)items的列表谈秫,然后拼接成字典扒寄。
    我們可以用itertools.chain來簡化items拼接過程:
    >>> d = dict(chain(d1.items(), d2.items()))

這種方案很不錯(cuò),可能比另外創(chuàng)建兩個(gè)不必要的列表更高效拟烫。

  1. ChainMap
    collections.ChainMap可以將多個(gè)字典或映射该编,在邏輯上將它們合并為一個(gè)單獨(dú)的映射結(jié)構(gòu):
>>> d = dict(ChainMap(d1, d2))

這種方法也很pythonic,而且也是通用方法硕淑。

  1. 字典拆分
    在Python3.5+中课竣,可以使用一種全新的字典合并方式:
    >>> d = {**d1, **d2}

這行代碼很pythonic,如果是你的python版本是3.5+置媳,用這種方法是很不錯(cuò)的選擇于樟。

總結(jié)

上面說了十種可以合并兩個(gè)字典成一個(gè)新字典的方式,具體用哪個(gè)取決于你拇囊。
如果使用的是Python3.5+的版本迂曲,那么字典拆分這種新語法應(yīng)該很適合你:

>>> d = {**d1, **d2}

原文博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市寥袭,隨后出現(xiàn)的幾起案子路捧,更是在濱河造成了極大的恐慌关霸,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杰扫,死亡現(xiàn)場離奇詭異队寇,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)章姓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門佳遣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人啤覆,你說我怎么就攤上這事苍日。” “怎么了窗声?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵相恃,是天一觀的道長。 經(jīng)常有香客問我笨觅,道長拦耐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任见剩,我火速辦了婚禮杀糯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘苍苞。我一直安慰自己固翰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布羹呵。 她就那樣靜靜地躺著骂际,像睡著了一般。 火紅的嫁衣襯著肌膚如雪冈欢。 梳的紋絲不亂的頭發(fā)上歉铝,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音凑耻,去河邊找鬼太示。 笑死,一個(gè)胖子當(dāng)著我的面吹牛香浩,可吹牛的內(nèi)容都是我干的类缤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼弃衍,長吁一口氣:“原來是場噩夢啊……” “哼呀非!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤岸裙,失蹤者是張志新(化名)和其女友劉穎猖败,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體降允,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡恩闻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了剧董。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幢尚。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖翅楼,靈堂內(nèi)的尸體忽然破棺而出尉剩,到底是詐尸還是另有隱情,我是刑警寧澤毅臊,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布理茎,位于F島的核電站,受9級(jí)特大地震影響管嬉,放射性物質(zhì)發(fā)生泄漏皂林。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一蚯撩、第九天 我趴在偏房一處隱蔽的房頂上張望础倍。 院中可真熱鬧,春花似錦胎挎、人聲如沸沟启。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽美浦。三九已至,卻和暖如春项栏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蹬竖。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國打工沼沈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人币厕。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓列另,卻偏偏與公主長得像,于是被迫代替她去往敵國和親旦装。 傳聞我的和親對(duì)象是個(gè)殘疾皇子页衙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359