2015-02-07 116 views
0

我如何參與包含詞典的詞典?比較python中的兩個詞典

這將在案件的工作字典包含簡單的值

# will show the keys with different values 

d1_keys = set(dict1.keys()) 
d2_keys = set(dict2.keys()) 
intersect_keys = d1_keys.intersection(d2_keys) 
modified = {} 
for i in intersect_keys: 
    if dict1[i] != dict2[i] : modified.update({i : (dict1[i], dict2[i])}) 

,但我有一個像這樣的詞典:

{ 'medic1' : {'date' : '02/02/2015', 'no' : '123' }, 'medic2' : {'date' :'02/03/2015', 'no' : '456' }} 
+4

你是什麼意思 「比較」?在你的例子中,它看起來像你試圖創建一個新的詞典來結合它們,但是你使用了一個未定義的變量'o'。請解釋你想要的結果。 – BrenBarn 2015-02-07 03:01:02

+0

我的錯誤是未定義的變量。我想要的結果是打印出來(我選擇了一個字典)在字典中修改過的鍵。 – 2015-02-07 03:13:19

回答

3

通過嵌套字典的遞歸函數。

  1. 通過for環獲得來自字典公共密鑰由keys()set operation.
  2. 迭代公共密鑰。
  3. 檢查type是否爲dict
  4. 如果值類型爲dict,則調用相同的函數並將值字典作爲參數傳遞。並將結果作爲關鍵字添加到modified字典中。
  5. 如果值類型不是字典,則將其添加到modified字典中。

代碼:

dict1 = { 
     'medic1' : {'date' : '02/02/2015', 'no' : '123' }, 
     'medic2' : {'date' : '02/03/2015', 'no' : '456' }, 
     'testkey1': 'testvalue1', 
     'testkey2': 'testvalue2', 
     'testkey3':{ "level2_1":"value2_1", 
      "level2_2":{ 
         "level3_1": "value3_1_change", 
         "level3_2": "value3_2", 
        } 
     } 
} 

dict2 = { 
     'medic1' : {'date' : '02/02/2015', 'no' : '456' }, 
     'medic2' : {'date' : '02/03/2015', 'no' : '456' }, 
     'testkey1': 'testvalue1', 
     'testkey2': 'testvalue22', 
     'testkey3':{ "level2_1":"value2_1", 
        "level2_2":{ 
           "level3_1": "value3_1", 
           "level3_2": "value3_2", 
          } 
       } 

} 

import copy 

def compareDict(dict1, dict2): 

    d1_keys = dict1.keys() 
    d2_keys = dict2.keys() 
    intersect_keys = set(d1_keys).intersection(set(d2_keys)) 
    modified = {} 
    for i in intersect_keys: 
     if dict1[i] != dict2[i] : 
      if isinstance(dict1[i], dict) and isinstance(dict1[i], dict): 
       modified[i]=compareDict(dict1[i], dict2[i]) 
      else: 
       modified.update({i : (dict1[i], dict2[i])}) 

    return copy.deepcopy(modified) 


modified = compareDict(dict1, dict2) 
import pprint 
pprint.pprint(modified) 

輸出:

[email protected]:~/Desktop/stackoverflow$ python 5.py 
{'medic1': {'no': ('123', '456')}, 
'testkey2': ('testvalue2', 'testvalue22'), 
'testkey3': {'level2_2': {'level3_1': ('value3_1_change', 'value3_1')}}} 
0

只要是可哈希(其中dict保障! - )是不是 - 代碼如:

common_keys = set(dict1).intersection(dict2) 

(你的第一個三線的簡化版本),然後

modified = {k: (dict1[k], dict2[k]) 
      for k in common_keys if dict1[k] != dict2[k]} 

(你的最後三行的簡化版本)將正常工作!