代码之家  ›  专栏  ›  技术社区  ›  copser

用听写理解python删除多个关键项

  •  2
  • copser  · 技术社区  · 6 年前

    我想从我的 json 我用的是像这样的字典理解法

    remove_key = ['name', 'description']
    
        data = {'full-workflow': {'task_defaults': {'retry': {'count': 3, 'delay': 2}}, 'tasks': {'t1': {'action': 'njinn.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': 'njinn.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': 'njinn.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': 'njinn.notify.send-mail', 'description': 'Send email to admin containing target path', 'input': {'from': 'bot@njinn.io', 'message': 'DB Dump {{ tasks(t1).result.filepath }} was stored to S3', 'subject': 'Prod DB Backup', 'to': 'admin@njinn.io'}, 'name': 'Send email', 'target': 'njinn'}}}, '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,我想 remove_key tasks 迪克特,那我做错什么了?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Rabbid76    6 年前

    您的数据是嵌套字典。如果要删除包含键的任何数据, remove_key ,然后我建议使用递归方法。这可以根据您的退出功能来实现。 remove_additional_key 轻松地:

    def remove_additional_key(data):
    
        sub_data = {} 
        for key in data:
            if key not in remove_key:
                if isinstance(data[key], dict): # if is dictionary
                    sub_data[key] = remove_additional_key(data[key])
                else:
                    sub_data[key] = data[key]
        return sub_data
    
    new_data = remove_additional_key(data)
    

    注意,如果条目是词典,可以通过 isinstance(data[key], dict) . 见 How to check if a variable is a dictionary in Python?

        2
  •  1
  •   Alex Tereshenkov    6 年前

    你有一本字典,里面有几个嵌套的字典。如果您确切知道要删除哪些子分区,可以使用:

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

    使用查找方法( key: data[key] )然而,在字典中,理解效率很低,对于如此小的数据量,您不会注意到有什么不同。

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

    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
    

    然后你可以打电话

    delete_keys_from_dict(data, ['name', 'description'])

    不用说,你应该 name 输入多个嵌套字典,所有字典都将被删除,因此请小心。