python - 从嵌套字典/json 中删除键

标签 python json python-3.x

我正在尝试使用 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但这没有帮助。有人可以在这里给我指点吗?

最佳答案

错误

您的错误来自表达式 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}]}

关于python - 从嵌套字典/json 中删除键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49102975/

相关文章:

python - 如何获取 1 列值并将其中一些值放入基于 bool 标志列的新列中?

python - 如何用Python进行日期推导?

python - 我可以通过 gsl_function 的包装或 cython 重新声明将 cython 类方法分配给 gsl_function 结构吗?

json - 来自 json 响应的结构

java - 类型 java.lang.String 无法在 org.json.JSON.typeMismatch(JSON.java :111)) 处转换​​为 JSONObject

python-3.x - ServerSelectionTimeoutError : basicdatabase-w4eg3. mongodb.net:27017: [Errno 11001] getaddrinfo 失败

Python 字典优化

python - Dataframe 从列表中添加多列,并创建每个列名

PHP数组的: How can i filter on an argument

python - 在父类中调用重写的父类方法