You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python从JSON文件中删除指定数组元素的问题咨询

问题原因

你在遍历weapons_dict['weapons']列表时,拿到的weapon只是列表中对应字典元素的临时引用,执行del weapon只会删除这个临时引用变量,不会对原列表产生任何修改。如果你选择逐个删除字典的键值对,本质是清空了列表中对应位置的字典对象,自然就会剩下空的{}元素,无法彻底移除列表项。

解决方案

方案1:列表推导式过滤(最简洁)

直接基于原列表构建新列表,筛掉所有符合删除条件的元素,不需要手动执行删除操作:

import json

def deleteWeapon():
    with open('json/weapons.json', 'r', encoding='utf-8') as info:
        weapons_dict = json.load(info)
    
    # 保留所有不符合删除条件的元素
    weapons_dict['weapons'] = [
        weapon for weapon in weapons_dict['weapons']
        if not (
            weapon['game'] == "DELETE" 
            and weapon['weapon'] == "DELETE" 
            and weapon['down'] == "0" 
            and weapon['up'] == "0" 
            and weapon['left'] == "0" 
            and weapon['right'] == "0"
        )
    ]
    
    with open('json/weapons.json', 'w', encoding='utf-8') as remove:
        json.dump(weapons_dict, remove, indent=2)

deleteWeapon()

方案2:按索引倒序遍历删除

如果你需要主动移除元素而非重建列表,可以倒序遍历列表索引操作,避免正序删除时出现的索引错位问题:

import json

def deleteWeapon():
    with open('json/weapons.json', 'r', encoding='utf-8') as info:
        weapons_dict = json.load(info)
    
    # 从最后一个元素倒序遍历到第一个
    for i in range(len(weapons_dict['weapons'])-1, -1, -1):
        weapon = weapons_dict['weapons'][i]
        if (
            weapon['game'] == "DELETE" 
            and weapon['weapon'] == "DELETE" 
            and weapon['down'] == "0" 
            and weapon['up'] == "0" 
            and weapon['left'] == "0" 
            and weapon['right'] == "0"
        ):
            # 直接删除列表对应索引的元素
            del weapons_dict['weapons'][i]
    
    with open('json/weapons.json', 'w', encoding='utf-8') as remove:
        json.dump(weapons_dict, remove, indent=2)

deleteWeapon()

两种方案都可以得到你期望的最终JSON结果。

内容的提问来源于stack exchange,提问作者RuthIsRoot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 19:06:00