2017-02-16 27 views
0

我真的不知道怎麼稱呼這個問題,但在我目前的項目中,我已經有太多避免它的解決方法,所以我在尋求幫助。內容感知字典更新

鑑於此示例代碼,

def sensitive_update(sensitive, updated): 
    # ??? 


sensitive_data = {'user1': {'password' : '1234'}, 'user2': {'password': '4321'}} 

updated_data = [ 
    {'user1': {'id': 13}}, 
    {'user2': {'password': '0000'}}, 
    {'user3': {'id': 14}} 
    ] 

for data in updated_data: 
    sensitive_update(sensitive_data, data) 

print(sensitive_data) 
# should print 
# {'user1': {'id': 13, 'password': '1234'}, 'user2': {'password': '0000'}, 'user3': {'id': 14}} 

確實存在寫入sensitive_update函數的大多-內置或短的方式,或通過遞歸地不可避免的字典中的每個值被手動循環?

編輯: 附加信息:功能合併所有可合併類型的字典,並創建一個不存在的

+0

是每個元素'updated_data'總是一個帶有單個鍵的字典?你是什​​麼意思手動循環通過字典?你應該循環遍歷'updated_data'列表...不行? –

+0

'updated_data'可以有多個鍵。 手動循環意味着檢查'sensitive'中的匹配鍵是否來自'updated'中的每個鍵,對值和它們的值執行相同的操作,直到找到非dict。 –

+0

updated_data *沒有鑰匙*。這是一個列表。請儘量準確,否則人們會對你的意思做出不同的假設,並且已經有一個非模棱兩可的術語來避免這個問題。 –

回答

2

我不知道你爲什麼會手動遍歷的字典類型的字典和鑰匙,但這裏是一般接近到你正在嘗試做的:

In [3]: sensitive_data = {'user1': {'password' : '1234'}, 'user2': {'password': '4321'}} 
    ...: 

In [4]: updated_data = [ 
    ...: {'user1': {'id': 13}}, 
    ...: {'user2': {'password': '0000'}}, 
    ...: {'user3': {'id': 14}} 
    ...: ] 

In [5]: for data in updated_data: 
    ...:  for k,v in data.items(): 
    ...:   sensitive_data.setdefault(k, {}).update(v) 
    ...: 

In [6]: sensitive_data 
Out[6]: 
{'user1': {'id': 13, 'password': '1234'}, 
'user2': {'password': '0000'}, 
'user3': {'id': 14}} 

您可以通過使用defaultdict太多,而不是一個普通的dictsetdefault方法提高性能。本質上,它是一個優化做setdefault法字典,但它與普通鑰匙進入工作:

In [11]: sensitive_data = {'user1': {'password' : '1234'}, 'user2': {'password': '4321'}} 
    ...: 
    ...: 

In [12]: from collections import defaultdict 
In [13]: d = defaultdict(dict) 

In [14]: d.update(sensitive_data) # convert plain dict to defaultdict 

In [15]: d 
Out[15]: 
defaultdict(dict, 
      {'user1': {'password': '1234'}, 'user2': {'password': '4321'}}) 

In [16]: for data in updated_data: 
    ...:  for k,v in data.items(): 
    ...:   d[k].update(v) 
    ...: 

In [17]: d 
Out[17]: 
defaultdict(dict, 
      {'user1': {'id': 13, 'password': '1234'}, 
      'user2': {'password': '0000'}, 
      'user3': {'id': 14}}) 
+0

天哪,我怎麼會想念那些?非常感謝你,這正是我一直在尋找的! –

0

您可以使用字典的更新方法:

for data in updated_data: 
    for k, v in data.items(): 
     if k in sensitive_data:   
      sensitive_data[k].update(v) # update the information of the corresponding user 
     else: 
      sensitive_data[k] = v 

sensitive_data 
# {'user1': {'id': 13, 'password': '1234'}, 
# 'user2': {'password': '0000'}, 
# 'user3': {'id': 14}}