我有一个具有列表的JSON文件(test.json):
[
{
"Action": "ADD",
"Properties": {
"Type": "New",
"Value": "List"
}
},
{
"Action": "REMOVE",
"Properties": {
"Type": "New",
"Value": "Image"
}
},
{
"Action": "ADD",
"Properties": {
"Type": "New",
"Value": "Text"
}
}
]
我需要遍历列表并删除包含'REMOVE'的键(项目),即item ['Action'] ==“ REMOVE”。
删除后应如下图所示:
[
{
"Action": "ADD",
"Properties": {
"Type": "New",
"Value": "List"
}
},
{
"Action": "ADD",
"Properties": {
"Type": "New",
"Value": "Text"
}
}
]
我用它来打印项目。如何删除项目?
with open('test.json') as json_data:
data = json.load(json_data)
for item in data:
if item['Action'] == "REMOVE":
print item
答案 0 :(得分:3)
如果需要就地删除该项目,则需要它的索引。
但这正是enumerate
的用途:
with open('test.json') as json_data:
data = json.load(json_data)
for index, item in enumerate(data):
if item['Action'] == "REMOVE":
del data[index]
break
请注意,这仅在您肯定只删除一个值时才有效。因为当您从列表中del
取值时,其后的所有内容都会上移一个插槽,并且如果您仍在尝试遍历列表,那么充其量最终会跳过循环中的一个值,而最糟糕的是你弄得一团糟。如果出现这种情况,有多种解决方法,但是如果不需要,则不要增加复杂性。
如果您出于某些原因不需要进行就地更改,除非data
很大,通常最好使用所有值创建一个新列表想要保留:
with open('test.json') as json_data:
data = json.load(json_data)
new_data = []
for item in data:
if item['Action'] != "REMOVE":
new_data.append(item)
...您可以将其简化为一个简单的理解:
with open('test.json') as json_data:
data = json.load(json_data)
new_data = [item for item in data if item['Action'] != "REMOVE"]
无论哪种方式,请注意,与del
不同的是,如果存在多个与"REMOVE"
匹配的值而无需花招,则此方法会自动起作用。
答案 1 :(得分:2)
每当需要过滤列表时,都应使用列表理解:
with open('test.json') as json_data:
data = json.load(json_data)
filtered_data = [item for item in data if item['Action'] != 'REMOVE']
答案 2 :(得分:0)
我最终使用了这个:
with open('test.json') as json_data:
data = json.load(json_data)
for index, item in enumerate(data):
if item['Action'] == "REMOVE":
del( data[index] )
with open('test.json', "w") as outfile:
outfile.write(json.dumps(data, indent=4))
答案 3 :(得分:-1)
data = [x for x in json_data if not x['ACTION'] == 'REMOVE']
另一种仅获取所需项目的新列表的方法。