如何在迭代时从json删除项目?

时间:2019-06-18 15:15:41

标签: python json python-2.7

我无法在迭代时从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中删除项目?有什么最佳实践吗?

谢谢!

1 个答案:

答案 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,在检查键时使用一个集合,因为集合查找是恒定时间。