Python从json dict中删除不';行不通

Python从json dict中删除不';行不通,python,json,Python,Json,当我调用此函数从从json导入的dict中删除项时,它不起作用 def removeKey(key): with open ("keys.json") as f: data = json.loads(f.read()) for d in data["keys"]: if(d["key"] == key): del d print(

当我调用此函数从从json导入的dict中删除项时,它不起作用

def removeKey(key):
    with open ("keys.json") as f:
        data  = json.loads(f.read())
        for d in data["keys"]:
            if(d["key"] == key):
                del d

    print(data)

    with open ("keys.json", "w") as f:
        json.dump(data, f)
这就是如何在JSON中设置dict

{"keys": [
    {"key": 1599853953652, "role": "MODERATOR", "Server": 753230650181550141, "uses": 1, "maxuses": 0}
    ]
}
del
删除名称。删除名称不会删除关联的值,除非它是该值的唯一名称

在…循环中,d的
创建
d
作为
数据[“键”][“键”]
的附加名称。当您
del d
时,您只删除名称
d
——您没有从
数据中删除值

这相当于:

x = 1
y = x
del y
运行此代码后,
x
仍然存在
dely
刚刚删除了名称
y


换句话说,想想贴在盒子上的便利贴。便利贴是名称,方框是值。一个盒子上可能有许多便笺,移除便笺不会破坏盒子(除非它是唯一的便笺)。

移除“角色”-一行演示

data = {"keys": [
    {"key": 1599853953652, "role": "MODERATOR", "Server": 753230650181550141, "uses": 1, "maxuses": 0}
    ]
}

data['keys'][0].pop('role',None)
print(data)
输出

{'keys': [{'key': 1599853953652, 'Server': 753230650181550141, 'uses': 1, 'maxuses': 0}]}

如果字典的
“key”
条目的值与某个数字匹配(例如
1599853953652
),您似乎真的想删除
下dict列表中的任何字典

假设是这样,最干净的方法实际上是创建一个新列表,过滤掉不需要的条目;您不能在迭代时简单地调用
del
删除元素

data = json.loads(f.read())
filtered_keys = [d for d in data["keys"] if d["key"] != key]
data["keys"] = filtered_keys

使用
del d
仅删除变量
d
,但不影响要从中删除的列表。您需要对列表本身进行操作。我会使用
pop()
方法,尽管
del
也可以

def removeKey(键):
将open(“keys.json”)作为f:
data=json.load(f.read())
对于枚举中的i,d(数据[“键]):
如果d[“键”]==键:
数据[“键”].pop(i)
打印(数据)
以open(“keys.json”、“w”)作为f:
json.dump(数据,f)

del d
仅删除变量
d
,它不会修改dict。不清楚实际要删除的内容。
key
看起来像什么,您希望最终结果是什么?您是从“键”内的dict列表中删除整个dict,还是删除特定的键/值对?如果(d[“键”]==key)
,您能否准确解释为什么出现这种情况?是否要删除列表中的字典,其中值等于
key
,只是为了更好地指定(我的错误)“key”dict有一个dict列表,每个dict都具有唯一的id。我希望找到其中key=to与函数一起传递的key的一个。然后我想删除所述密钥存在于(密钥、角色、服务器等)中的对象。如果列表长度大于1怎么办?在示例输入中不是这样的,如果输入更改将包含更多项怎么办?但这只是为了测试,但我发现answer@JanuZz_dk伟大的下次请分享实际输入。
data = json.loads(f.read())
filtered_keys = [d for d in data["keys"] if d["key"] != key]
data["keys"] = filtered_keys