Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用dict comprehension python删除多个关键项_Python_Python 3.x - Fatal编程技术网

使用dict comprehension python删除多个关键项

使用dict comprehension python删除多个关键项,python,python-3.x,Python,Python 3.x,我想从我的json中删除多个键,我正在使用这样的字典理解 remove_key = ['name', 'description'] data = {'full-workflow': {'task_defaults': {'retry': {'count': 3, 'delay': 2}}, 'tasks': {'t1': {'action': 'nn.postgres.export-db', 'description': 'Dump prod DB with default setti

我想从我的
json
中删除多个键,我正在使用这样的字典理解

remove_key = ['name', 'description']

    data = {'full-workflow': {'task_defaults': {'retry': {'count': 3, 'delay': 2}}, 'tasks': {'t1': {'action': 'nn.postgres.export-db', 'description': 'Dump prod DB with default settings', 'input': {'database': 'prod', 'filepath': '/var/tmp/prod-dump.pgsql', 'host': 'postgres.local', 'password': 'mypass', 'username': 'myuser'}, 'name': 'db export', 'on-success': ['t2']}, 't2': {'action': 'nn.aws.upload-to-s3', 'description': 'Upload to S3 bucket for development', 'input': {'sourcepath': '{{ tasks(t1).result.filepath }}', 'targetpath': 's3://mybucket/prod-dump.pgsql'}, 'name': 'Upload to S3', 'on-success': ['t3'], 'retry': {'count': 5, 'delay': 5}}, 't3': {'action': 'nn.shell.command', 'description': 'Remove temp file from batch folder ', 'input': {'cmd': 'rm {{ tasks(t1).result.filepath }}'}, 'name': 'Remove temp file', 'on-complete': ['t4']}, 't4': {'action': 'nn.notify.send-mail', 'description': 'Send email to admin containing target path', 'input': {'from': 'bot@nn.io', 'message': 'DB Dump {{ tasks(t1).result.filepath }} was stored to S3', 'subject': 'Prod DB Backup', 'to': 'admin@nn.io'}, 'name': 'Send email', 'target': 'nn'}}}, 'version': '2'}

    def remove_additional_key(data):
        return {
            key: data[key] for key in data if key not in remove_key
        }
那就

new_data = remove_additional_key(data)

因为这是嵌套dict,所以我想从
任务
dict中删除\u key
,那么我做错了什么呢?

您有一个包含一些嵌套字典的字典。如果您确切知道要删除这些键的子词典,可以使用:

data['full-workflow']['tasks']['t1'].pop('name')

在字典理解中使用查找方法(
key:data[key]
)效率低下,但是,在如此小的数据量上,您不会注意到差异

如果您不知道嵌套字典的确切路径,可以使用一个函数(为方便起见发布另一个函数)

然后你可以打电话

从目录(数据,['name','description'])中删除密钥。


不用说,如果您在多个嵌套字典中有
name
键,那么所有这些键都将被删除,因此请小心。

您的数据是嵌套字典。如果要删除包含在
remove\u key
中的键的任何数据,我建议使用递归方法。这可以根据您的退出功能
删除附加键
,轻松实现:

def删除附加密钥(数据):
子_数据={}
对于输入数据:
如果钥匙不在,请拔出钥匙:
if is instance(数据[键],dict):#if is dictionary
子密钥数据[密钥]=删除附加密钥(数据[密钥])
其他:
子单元数据[键]=数据[键]
返回子单元数据
新建数据=删除附加密钥(数据)

注意,如果条目是字典,可以通过
isinstance(data[key],dict)
检查。请参见

在主
数据
字典中嵌套了多个字典
name
description
都是其中一个内部字典中的键,这就是它们没有被删除的原因。您的字典中只有两个您正在迭代的键,
full workflow
version
。啊,好的,那么嵌套dict,回到绘图板。@PetarP如果您对所需操作有清晰的想法,可以编辑您的问题。如果
name
description
是任何嵌套字典中的关键字,是否要将它们删除?@yuvgin我想将它们从
任务中删除
isinstance
很好,不需要使用
类型
,但这将删除它所测试的完整字典,当我在函数中传递我的dict时,输出dict是空的,我已经检查了,谢谢你的更改,这个,你在哪里更快:)@PetarP,不客气。但请注意,你也应该考虑其他答案的建议。我会,亚历克斯的建议和建议被注意到,地狱的一切是我需要做更多的清洁,至少我有一个很好的基础来玩。
def delete_keys_from_dict(d, lst_keys):
    for k in lst_keys:
        try:
            del dict_del[k]
        except KeyError:
            pass
    for v in dict_del.values():
        if isinstance(v, dict):
            delete_keys_from_dict(v, lst_keys)

    return dict_del