如何通过数组删除JSON对象?(Python)

2024-10-07 16:30:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道标题看起来有点混乱,但一旦我分享代码,你就会知道我在说什么。总体而言,我对JSON和Python还比较陌生。我正在尝试用3个简单的命令制作一个杂货清单程序:list、add和remove。列表将列出您通过添加添加添加的所有食品杂货。删除按名称删除项目。这就是我遇到麻烦的地方。这是我的设置的样子:

{"grocery_list": 
   [{"itemname": "Milk"},
   {"itemname": "Bread"},
   {"itemname": "Bacon"}]
}

这是我的删除函数和数据:

with open('groceriesjson.json','r') as data_file:
        data = json.load(data_file)
def removeitem(item):
        global data
        for i in range(len(data)):
            if data[i]["itemname"] == item:
                data.pop(i)
                print("Successfully removed from your list.")
                main()

当我运行该程序时,会出现以下错误:

Traceback (most recent call last):
  File "C:\Users\me\Desktop\test.py", line 48, in <module>
    main()
  File "C:\Users\me\Desktop\test.py", line 44, in main
    removeitem(toremove)
  File "C:\Users\me\Desktop\test.py", line 18, in removeitem
    if data[i]["itemname"] == item:
 KeyError: 0

我也尝试过使用range(1,len(data)),但是当我运行它时,什么都没有发生。如果您需要更多的代码片段或任何其他内容,请发表评论。非常感谢


3条回答

您未能分阶段测试您的程序;您现在有多个错误需要纠正。请参阅debugging help的这个可爱的参考。如果没有其他内容,请插入频繁的print命令以检查您对数据类型和值的假设

您没有“JSON对象”;您有一个Python dict。更好的例子是,删除输入序列并用硬编码的dict等价物替换它。调试的第一步是隔离问题,这表明输入是独立的

现在,看看您的结构:dict有一个条目,由字符串“杂货店列表”键入。您的直接错误是,您试图使用下标0以list的形式访问此文件。这对于下一级数据[“杂货店列表”]很有效,因为列表

接下来,当您在迭代列表时更改列表时,您将遇到问题。请参阅该主题的相关问题,以获取提示。“正常”的方法是使用列表理解,如Sushanth的答案所示

从删除循环中调用例程main;这几乎肯定是一个错误,特别是如果这个例程确实是您的主程序。放入print语句并按照逻辑查看其实际工作原理

也许是这样的:

def removeitem(del_item):
        global data
        grocery_list = data['grocery_list']

        for i, item in enumerate(grocery_list):
            if item["itemname"] == del_item:
                grocery_list.pop(i)
                print("Successfully removed from your list.")
                break

        return grocery_list

您可以改为使用list comprehension

values = {
    "grocery_list": [
        {"itemname": "Milk"},
        {"itemname": "Bread"},
        {"itemname": "Bacon"}
    ]
}

print({
    "grocery_list": 
        [v for v in values['grocery_list'] if v['itemname'] != 'Milk']
})

相关问题 更多 >