Python 无法使用del函数删除json中的字典键。得到一个打字错误

Python 无法使用del函数删除json中的字典键。得到一个打字错误,python,json,dictionary,del,Python,Json,Dictionary,Del,代码缩短对于这个例子,我正在迭代它,就好像它有多个键一样 string = ''' { "people": { "a": { "parent": { "father": "x" } } } } ''' data = json.loads(string) 我确保我的条件有效,它输出“ok”,所以它很好 for name

代码缩短对于这个例子,我正在迭代它,就好像它有多个键一样

string = '''
{
    "people":
    {
        "a":
        {
            "parent":
            {
                "father": "x"
            }
        }
    }
}
'''

data = json.loads(string)
我确保我的条件有效,它输出“ok”,所以它很好

for name in data["people"].values():
    if name["parent"]["father"] == "x":
        print("ok")
然后我修改上面的代码以删除该键,并得到以下错误:

TypeError:不可损坏的类型:“dict”

for name in data["people"].values():
    if name["parent"]["father"] == "x":
        del data["people"][name]
我做错了什么


谢谢

您试图使用
name
作为键,但
name
实际上是一本词典,而不是字符串。使用
.items()
获取名称和内容:

for name, contents in data["people"].items():
    if contents["parent"]["father"] == "x":
        del data["people"][name]
但是,请注意,这也不起作用。不能在迭代字典时更改其大小。您可以通过调用
列表
或其上的类似功能,强制
.items()
完全消费:

for name, contents in list(data["people"].items()):
    if contents["parent"]["father"] == "x":
        del data["people"][name]
最后,
数据
将只是
{'people':{}}
,我相信这就是你想要的。

试试这个:

import json
string = '''
{
    "people":
    {
        "a":
        {
            "parent":
            {
                "father": "x"
            }
        }
    }
}
'''

data = json.loads(string)
l = []

for key, values in data["people"].items():
    if values["parent"]["father"] == "x":
        l.append(key)

for x in l:
    data["people"].pop(x)

print(data)

我很高兴我能帮上忙非常感谢,我花了一段时间才明白为什么列表方法是有效的(我太笨了),然后我终于明白了!但老实说,我仍然无法理解items()和values()之间的区别,是时候做一些谷歌搜索了:)@Jsh0s实际上很简单。有三个主要的字典迭代函数:
,和
<代码>键迭代键,
迭代值,
迭代元组,第一个元素是键,第二个元素是对应的值。