使用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
相关产品推荐
相关产品推荐

