【问题标题】:Python, delete JSON element having specific key from a loopPython,从循环中删除具有特定键的 JSON 元素
【发布时间】:2019-02-09 23:05:11
【问题描述】:

使用 Python,我需要删除 JSON 数组中具有特定“名称”键值的所有对象。但是,我不能从循环中做到这一点。

Imaging 我想删除以下输入中所有名称为“bad”的项目:

{
  'myArray' : [
    {
      'name' : 'good',
      'value' : '1'
    },
    {
      'name' : 'bad',
      'value' : '2'
    }
  ]
}

所以我使用下面的 Python 测试用例:

myData = {'myArray': [{'name': 'good', 'value': '1'}, {'name': 'bad', 'value': '2'}]}

for a in myData['myArray']:
  if (a['name'] =='bad'):
    del a

print(json.dumps(myData))

我看到 myData 没有改变。

我认为这是因为我尝试删除循环的迭代器,这可能被解释器视为有风险的操作,但是 Python 没有报告运行时错误或警告。

在这种情况下推荐的方法是什么?

谢谢!

【问题讨论】:

  • "我认为这是因为我尝试删除循环的迭代器,这可能被解释器视为有风险的操作,但是 Python 没有报告运行时错误或警告"您没有删除迭代器。事实上,您无权访问迭代器。您只是在a 上执行del,这是(隐式)在(不可见)迭代器上调用next 的结果分配给的变量。因此,您删除了该变量,但在下一次迭代中,该变量被简单地重新创建。你想改变你的集合,但你可能不应该在迭代时
  • 使用(嵌套的)字典/列表理解。切勿在迭代对象时尝试删除对象的元素。
  • @smci 或只是一个 for 循环。
  • juanpa.arrivillaga,谢谢你,你的解释“那个变量只是重新创建”给这里带来了光明。我看到了一种解决方法:将除“坏”之外的所有元素复制到新创建的集合中,然后用它代替旧的集合。不是最佳解决方案,但如果有人没有建议更简单的方法,我会使用它。

标签: python json for-loop


【解决方案1】:

Remove element from list when using enumerate() in python 中的一种方法 - 对称为 [:] 的列表副本进行循环 - 也可以:

for a in myData['myArray'][:]:
  if (a['name'] == u'bad'):
     myData['myArray'].remove(a)

谢谢大家!

【讨论】:

    【解决方案2】:

    使用(嵌套的)字典/列表理解。迭代对象时切勿尝试删除对象的元素

    >>> [x for x in myData['myArray'] if x['name'] != 'bad']
    [{'name': 'good', 'value': '1'}]
    

    将结果分配给myData['myArray'],或任何你想要的。

    【讨论】:

      【解决方案3】:

      您可以使用列表推导。以下是参考。

      new_list =  [obj for obj in myData['myArray'] if(obj['name'] != 'bad')] 
      print new_list
      

      【讨论】:

        【解决方案4】:
        myData = {'myArray': [{'name': 'good', 'value': '1'}, {'name': 'bad', 'value': '2'}]}
        
        myData_clean = [x for x in myData['myArray'] if x['name'] !='bad']
        myData_clean = {'myArray':myData_clean}
        print(myData_clean)
        

        输出:

        {'myArray': [{'name': 'good', 'value': '1'}]}
        

        【讨论】:

          猜你喜欢
          • 2023-03-16
          • 1970-01-01
          • 1970-01-01
          • 2010-10-15
          • 1970-01-01
          • 1970-01-01
          • 2018-04-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多