我正在尝试使用python从JSON文件中删除元素。我已经将字典转换为python字典,到目前为止我一直在失败。 JSON file I am working with is uploaded here
如果密钥为'access_ip_v4'
,我需要从JSON中删除所有关联的密钥和值。
我不能使用sed / grep或任何其他正则表达式技术或字符串替换技术。我有点坚持使用python词典。
到目前为止,这是我的工作。
def dict_sweep(input_dic, k):
for key in input_dic.keys():
if key == k:
print("DIRECT DELETE")
del input_dic[key]
elif type(input_dic[key]) is dict:
print('DICT FOUND')
input_dic[key] = dict_sweep(input_dic[key], k)
elif isinstance(type(input_dic[key]), type([])):
print("LIST FOUND")
for i, v in enumerate(input_dic[key]):
if isinstance(input_dic[key][i], dict):
input_dic[key][i] = dict_sweep(v, k)
return input_dic
我认为我的代码在遇到列表时失败了。在这个意义上失败,
clean_data = dict_sweep(data, 'access_ip_v4')
print(clean_data)
将再次打印data
而不是打印已清理的数据版本。
我不太确定。我已经阅读了其他一些问题,例如this,但它没有帮助。有人能指点我吗?
答案 0 :(得分:3)
您的错误来自表达式isinstance(type(input_dic[key]), type([]))
。您想检查input_dict[key]
是否为列表,而不是type(input_dic[key])
是哪种类型。
所以用这个替换最后的elif
语句。
elif isinstance(input_dic[key], list):
print("LIST FOUND")
...
尽管不建议从正在迭代的对象中删除。特别是,如果您使用的是Python3,则上述代码将引发RuntimeError: dictionary changed size during iteration
。正确的方法是在没有要删除的键的情况下构建新的字典。
def dict_sweep(input_dict, key):
if isinstance(input_dict, dict):
return {k: dict_sweep(v, key) for k, v in input_dict.items() if k != key}
elif isinstance(input_dict, list):
return [dict_sweep(element, key) for element in input_dict]
else:
return input_dict
结果如下。
d = {'delete': 1, 'ok': [{'delete': 1, 'ok': 1}]}
new_d = dict_sweep(d, 'delete') # {'ok': [{'ok': 1}]}