Python基于值迭代并从列表中删除键



我有一个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"的键(项(,即项[操作]="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

如果需要在适当的位置删除项,则需要其索引。

但这正是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"匹配,则此方法会自动工作,不需要任何技巧。

无论何时需要过滤列表,都应该使用列表理解:

with open('test.json') as json_data:
data = json.load(json_data)
filtered_data = [item for item in data if item['Action'] != 'REMOVE']

我最终使用了这个:

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))
data = [x for x in json_data if not x['ACTION'] == 'REMOVE']

另一种获取仅包含所需项目的新列表的方法。

最新更新