我无法在迭代时从json中删除项目。我尝试了几种方法来实现它,但是它没有按预期工作。
有一个json示例:
{
"year" : 2019,
"values" : [{
"key" : 70,
"messages" : [{
"code" : 997,
"messages" : 1112245
}
]
}, {
"key" : 90,
"messages" : [{
"code" : 997,
"messages" : 26347680
}
]
}
]}
我需要迭代“值”并删除带有特定“键”的项目。 有一个单独的键列表:
key_list = [60, 70, 80, 90]
我尝试使用以下代码,但不起作用:
for i in json["values"]:
if i["key"] not in key_list :
del i
我还尝试使用pop,popitem,clear无效。
当前版本为:
def delRecords(json):
x = 0
for i in json["values"]:
if i["key"] not in key_list :
json["mtids"].pop(x)
x += 1
return json
但是它看起来很难看,我必须多次启动脚本才能删除所有项目。 您能否提出建议,我如何从json中删除项目?有什么最佳实践吗?
谢谢!
答案 0 :(得分:3)
如果您反向进行迭代并删除,则无需黑客攻击
key_set = {60, 70, 80, 90}
values = jsonData['values'] # hold reference, less typing
for i in reversed(range(len(values))):
if values[i]['key'] not in key_list:
del values[i]
或者,如果您的数据大小合理,则可以使用列表推导来重新创建列表:
jsonData['values'] = [d for d in jsonData['values'] if d['key'] in key_set]
PS,在检查键时使用一个集合,因为集合查找是恒定时间。