Python从json dict中删除不';行不通
当我调用此函数从从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(
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