1. 程式人生 > >Python合併兩個字典成一個新字典的幾種方法分析比較

Python合併兩個字典成一個新字典的幾種方法分析比較

兩個字典如下:

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

合併後的結果如下(即,key相同時後面字典值覆蓋前面字典):

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

首先,說明字典並不支援+加法運算:

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

現總結如下幾種方法以及簡要分析比較。

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

首先建立一個空字典,並使用update方法向字典中新增元素。注意,先新增的是d1,以保證後面新增的d2重複鍵會覆蓋d1。
此方法滿足了我們的要求,而且清晰明確,可是三行程式碼總感覺不夠Pythonic。

  1. 先複製,後更新
    先複製d1字典建立一個新字典,然後使用d2來更新前面建立的新字典。
>>> d = d1.copy()
>>> d.update(d2)

對比方法一,這種複製d1的方法,更明顯的表現出d1作為預設值。

  1. 字典構造器
    還可以使用字典的構造器dict()複製字典,然後再更新:
>>> d = dict(d1)
>>> d.update(d2)

與方法二很相似,但是沒有方法二直接明瞭。

  1. 關鍵字引數hack
    你可能見過下面這個巧妙的解決辦法:
>>> d = dict(d1 , **d2)

只有一行程式碼,看上去很酷,但是有一個問題,這種hack技巧只有在字典的鍵是字串時才有效。

看上去很cool,但是不通用,字典的鍵必須是字串才可以用這種關鍵字引數方法。

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

字典推導式方法滿足要求,只是巢狀的字典推導式,不那麼清晰,不易於理解。

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

而且,d2的元素在列表後面,所以在鍵重複時可以覆蓋d1。如果在Python2中,items()方法本身返回的就是列表,無需用list()轉成列表。

元素拼接在構造字典可以滿足要求,只是看上去程式碼有些重複。

  1. 元素並集
    在Python3中,字典返回的是檢視物件,鍵的檢視物件是一個類似集合的物件,如果字典中的值可以保證是唯一的可雜湊的,此時items返回的檢視物件也是一個類似集合的物件:
    >>> d = dict(d1.items() | d2.items())

這種方法挺有意思,可是並不準確,因為集合是無序的,鍵重複時不能保證誰覆蓋誰,而且字典中的值通常也是不可雜湊的,當然也就不能返回一個類似集合的物件。

  1. chain items
    目前為止,我們討論的解決方案中,最符合Python語言習慣而且只有一行程式碼實現的,是建立兩個items的列表,然後拼接成字典。
    我們可以用itertools.chain來簡化items拼接過程:
    >>> d = dict(chain(d1.items(), d2.items()))

這種方案很不錯,可能比另外建立兩個不必要的列表更高效。

  1. ChainMap
    collections.ChainMap可以將多個字典或對映,在邏輯上將它們合併為一個單獨的對映結構:
>>> d = dict(ChainMap(d1, d2))

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

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

這行程式碼很pythonic,如果是你的python版本是3.5+,用這種方法是很不錯的選擇。

總結

上面說了十種可以合併兩個字典成一個新字典的方式,具體用哪個取決於你。
如果使用的是Python3.5+的版本,那麼字典拆分這種新語法應該很適合你:

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

相關推薦

Python合併字典一個字典方法分析比較

兩個字典如下:>>> d1 = {'name' : 'revotu', 'age' : 99} >>> d2 = {'age' : 24, 'sex' : 'male'} 合併後的結果如下(即,key相同時後面字典值覆蓋前面字典):>>> d {'sex'

關於伺服器資料庫之間的資料方法實踐

以前資料庫和環境相關的都是開發之前都是開發LEADER 搞定了,今天自己搞本地資料庫做測試,由於表比較多,資料比較多, 所以在用了很多種資料同步的方法,現在總結下下面幾種方法的感受 1.通過轉儲SQL 檔案,通過轉儲表結構和資料SQL 檔案的方式 ,然後匯入到本地的資料庫    缺點:

python 合併已經排好序的陣列 並且陣列不能有重複的元素

'''題目一:合併兩個已經排好序的陣列思路是遍歷兩個陣列,分別比較每個元素, 將較小的新增到新的數組裡,比較完短的陣列後將長的陣列的元素直接拷貝到新陣列即可我寫完後面試官說有一個問題 就是新陣列有重複的資料 當時想的是再給新陣列排序 去掉重複陣列 他不滿意今天查了一下最佳答案

Python 合併字典的各種方法以及效率的比較

下面的程式碼舉例了5種合併兩個字典的方法,並且做了個簡單的效能測試 #!/usr/bin/python import time def f1(d1, d2): return dict(d1, **d2) def f2(d1, d2):

python合併資料夾

# 作用: 7 # 合併並兩個目錄/資料夾。 8 # 將目錄A合併到目錄B,同級目錄下, 9 # 將A中有,B中沒有的目錄完全複製到B中; 10 # 將A中沒有,B中有的目錄不做改動; 11 # 將A中做了修改的檔案,在B的同級目錄下建立一個副本。(注意不是覆蓋)

python 合併有序陣列

給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為一個有序陣列。 說明: 初始化 nums1 和 nu

python 合併有序連結串列

參考了這個博主的答案(https://blog.csdn.net/gleam_/article/details/80149010),之前遞迴一直學的不是太好,但真的想通了以後寫起來很神清氣爽。 1. 遞迴的思路 # Definition for singly-linked list. #

【LeetCode 簡單題】7-用Python合併有序連結串列

宣告: 今天是第7道題,將兩個有序連結串列合併為一個新的有序連結串列並返回,新連結串列是通過拼接給定的兩個連結串列的所有節點組成的。以下所有程式碼經過樓主驗證都能在LeetCode上執行成功,程式碼也是借鑑別人的,在文末會附上參考的部落格連結,如果侵犯了博主的相關權益,請聯

Python合併列表的方法

瀏覽部落格看到一個問題:如何合併兩個列表,今天就來探討一下。 方法一 最原始,最笨的方法,分別從兩個列表中取出所有的元素,再放入新列表中就OK了。示例程式碼如下: list1 = [1,2,3] list2 = [4,5,6] list_new =

關於數字順序顛倒函式的常見錯誤

在我沒學指標之前,編寫兩個數字顛倒的這個函式時,我感覺沒有太大的問題,但是老師給我們講了指標的相關的知識後,這個函式的問題就出現了以下問題: (前提是不允許在函式中使用列印函式)第一個函式一直到第三個函式的錯誤都是沒有把數字換過來,例如在下面這個主函式中,輸入a=10,b=

在頁面中隱藏一個元素的方法

osi play hid abs 隱藏 一個 bili cit eight 1.display:none,不占據空間,無法點擊; 2.visibility:hidden,占據空間,無法點擊; 3.height:0; overflow:hidden,不占據空間,無法點擊; 4

Python爬蟲系列:判斷目標網頁編碼的方法

qpi data- tps 分享 運行 ofo html nbsp 來看 在爬取網頁內容時,了解目標網站所用編碼是非常重要的,本文介紹幾種常用的方法,並使用幾個網站進行簡單測試。 代碼運行結果: 從不同國家的幾個網站測試結果來看,utf8使用的較多(對於純英文網站,用什

c#除掉字符串最後一個字符方法

要去 參數 aaa style log int print mov www 有一數組;轉換為字符串後為 aaa|bbb|ccc|ddd|現要去掉最後一個|第一種方法:語句為:str1=aaa|bbb|ccc|ddd|str=str1.substring(0,lastinde

java刪除字串最後一個字元的方法

字串:string s = "1,2,3,4,5,"  目標:刪除最後一個 ","  方法:     1、用的最多的是Substring,這個也是我一直用的        

python中列印金字塔和九九乘法表的方法

# 列印九九乘法表for i in range(1,10): for j in range(1,i+1): # x=i*j # print(i,'*',j,'=',x,end=' ') print('%s*%s=%s' %(i,j,i*j),end=' ')

Python中求數字的平方根和平方的方法

方法一: 使用內建模組 >>> import math >>> math.pow(12, 2) # 求平方 144.0 >>> mat

C#刪除字串最後一個字元的方法

 字串:string s = "1,2,3,4,5,"目標:刪除最後一個 ","方法一:s = s.Remove(s.LastIndexOf(","), 1); ; //移除掉最後一個","方法二:用的最多的是Substring,這個也是我一直用的s = s.Substrin

將類陣列物件轉化陣列物件的方法

今天遇到一個問題,發現在操作類陣列物件時特別不方便,於是就想到能否將類陣列物件轉化成陣列物件,然後再利用陣列物件強大又便捷的方法來操作呢?然後...然後在尋找解決方法的時候我就被自己蠢哭了...事情是這樣發展的: 一、Array.prototype.slice.call(a

python獲取字母在字母表對應位置的方法及效能對比較

    某些情況下要求我們查出字母在字母表中的順序,A = 1,B = 2 , C = 3, 以此類推,比如這道題目 https://projecteuler.net/problem=42 其中一步解題步驟就是需要把字母換算成字母表中對應的順序。 獲取字母在字母表對應位置的

Python併發程式設計之建立多執行緒的方法

今天的內容會比較基礎,主要是為了讓新手也能無障礙地閱讀,所以還是要再鞏固下基礎。學完了基礎,你們也就能很順暢地跟著我的思路理解以後的文章。本文目錄學會使用函式建立多執行緒學會使用類建立多執行緒多執行緒:必學函式講解經過總結,Python建立多執行緒主要有如下兩種方法:函式類接