Python根据值

时间:2018-07-19 21:28:14

标签: python json

我有一个具有列表的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

4 个答案:

答案 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']

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