【发布时间】: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,谢谢你,你的解释“那个变量只是重新创建”给这里带来了光明。我看到了一种解决方法:将除“坏”之外的所有元素复制到新创建的集合中,然后用它代替旧的集合。不是最佳解决方案,但如果有人没有建议更简单的方法,我会使用它。