簡體   English   中英

如何通過數組刪除 JSON object? (Python)

[英]How can I remove a JSON object via array? (Python)

我知道標題看起來有點混亂,但一旦我分享代碼,你就會知道我在說什么。 總的來說,我對使用 JSON 和 Python 還是很陌生。 我正在嘗試使用 3 個簡單的命令制作一個購物清單程序:列出、添加和刪除。 List 將列出您通過 add 添加的所有雜貨。 Remove 按名稱刪除項目。 這就是我遇到麻煩的地方。 這是我的設置的樣子:

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

這是我刪除 function 和數據:

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))但是當我運行它時沒有任何反應。 如果您需要更多代碼片段或其他任何內容,請發表評論。 非常感謝

您可以改為使用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']
})

您未能分階段測試您的程序; 您現在有多個錯誤需要糾正。 請參閱這個可愛的參考以獲取 調試幫助 如果不出意外,請插入頻繁的print命令來檢查您對數據類型和值的假設。

您沒有“JSON 對象”; 你有一個 Python dict 舉個更好的例子,刪除輸入序列並將其替換為硬編碼的 dict 等效項。 調試的第一步是隔離問題,這表明輸入是獨立的。

現在,看看你的結構:字典有一個條目,由字符串“grocery_list”鍵入。 您的直接錯誤是您嘗試使用下標 0 將其作為list訪問。這適用於下一級數據 [“grocery_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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM