【问题标题】:How to delete an item from json while iterating it?迭代时如何从json中删除一个项目?
【发布时间】:2019-06-18 15:15:41
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: python json python-2.7


    【解决方案1】:

    如果您反向迭代并删除,则无需骇客:

    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,在检查键时使用集合,因为集合查找是常数时间。

    【讨论】:

      猜你喜欢
      • 2016-04-25
      • 2022-05-17
      • 2021-11-08
      • 2014-10-26
      • 1970-01-01
      • 2023-03-26
      相关资源
      最近更新 更多