我真的不知道怎么称呼这个问题,但在我目前的项目中,我已经有太多的避免它的变通办法,所以我在寻求帮助。
鉴于此示例代码,
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
答案 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}}