我想从自己的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)
因为这是嵌套字典,所以我想从remove_key
字典中tasks
,所以我在做什么错了?
答案 0 :(得分:1)
您有一本带有一些嵌套字典的字典。如果您确切知道要删除哪些键,则可以使用:
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
键,则所有字典都将被删除,因此请小心。
答案 1 :(得分:1)
您的数据是嵌套字典。如果要使用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?