内容感知字典更新

时间:2017-02-16 00:18:29

标签: python python-3.x dictionary

我真的不知道怎么称呼这个问题,但在我目前的项目中,我已经有太多的避免它的变通办法,所以我在寻求帮助。

鉴于此示例代码,

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函数编写方式,或者手动循环遍历字典中的每个值都是不可避免的?

编辑: 附加信息:函数合并所有可合并的dicts,并创建不存在的dicts和key

2 个答案:

答案 0 :(得分: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代替使用dict方法的普通setdefault来获得性能。从本质上讲,它是一个优化的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}})

答案 1 :(得分: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}}