python - 如何屏蔽 Python 3 嵌套字典以返回仅包含某些项目的新字典?

标签 python dictionary iterator

我正在使用 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/

相关文章:

python - 遍历 my_dict.keys() 并修改字典中的值是否会使迭代器无效?

c++ - 从 vector 中提取子 vector 而不复制

python - 当使用 selenium 编写测试时,如何查看生成的 HTML?

python - 在没有库的python中自定义crc32计算

python - 计算 Pandas 数据框中的数据类型

python - 是否有一种简单的方法可以在不使用 CSV 的情况下将文本文件转换为 Python 中的字典?

java - 使用 it.next() 返回元素和直接在 sysout 中打印哈希集的对象有什么区别

python - ValueError : Cannot feed value of shape (256, 0) 对于张量 'Placeholder_2:0' ,其形状为 '(?, 500)'

java - 是否有 java API 来检索单词发音的声音?

postgresql - 是否可以在 PostgreSQL 中动态创建字典?