我正在使用 API 的多个端点,这些端点返回的数据非常冗长。我想将此数据的一个子集提供给其他地方的另一段代码。
假设我有几个像这样的字典(我打算循环和过滤):
asset = {
'id': 1,
'name': 'MY-PC',
'owner': 'me',
'location': 'New York City',
'model': {
'id': 1,
'name': 'Surface',
'manufacturer': {
'id': 1,
'name': 'Microsoft'
}
}
}
我想创建一个函数来接收该字典,以及一个“掩码”,用于创建仅包含允许项目的新字典。这可能是一个示例掩码(不过,我可以使用任何格式使生成的代码最简洁):
mask = {
'id': True,
'name': True,
'model': {
'id': True,
'name': True,
'manufacturer': {
'name': True
}
}
}
函数应该返回这个:
mask = {
'id': 1,
'name': 'MY-PC',
'model': {
'id': 1,
'name': 'Surface',
'manufacturer': {
'name': 'Microsoft'
}
}
}
Python 3 中是否已经内置了一些东西来帮助解决这个问题?看起来如果我必须手动执行此操作,它很快就会变得非常难看。我找到了 itertools.compress
,但它似乎适用于列表,无法处理字典的复杂性。
最佳答案
您可以通过仅选择主字典中对应的值,从掩码中递归构建一个新字典:
def prune_dict(dct, mask):
result = {}
for k, v in mask.items():
if isinstance(v, dict):
value = prune_dict(dct[k], v)
if value: # check that dict is non-empty
result[k] = value
elif v:
result[k] = dct[k]
return result
print(prune_dict(asset, mask))
{'id': 1,
'model': {'id': 1, 'manufacturer': {'name': 'Microsoft'}, 'name': 'Surface'},
'name': 'MY-PC'}
关于python - 如何屏蔽 Python 3 嵌套字典以返回仅包含某些项目的新字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46311253/