2 回答

TA貢獻1877條經驗 獲得超6個贊
一種可能的解決方法。
將待辦事項列表(字典列表)作為參數傳遞,因此它會發(fā)生變化:
TodoList=[{'ID':5,'TodoItem':'walk','isDone':False}, {'ID':6,'TodoItem':'talk','isDone':True}]
def RemoveItem(ID, TodoList):
if not any(todoItem['ID'] == ID for todoItem in TodoList):
print('item does not exist');
else:
for item in TodoList:
if item['ID']== ID: TodoList.remove(item)
RemoveItem(5, TodoList)
print(TodoList)
#=> [{'ID': 6, 'TodoItem': 'talk', 'isDone': True}]
要使您的解決方案起作用,您需要返回:
def RemoveItem(ID, TodoList):
if not any(todoItem['ID'] == ID for todoItem in TodoList):
return 'item does not exist';
else:
return list(filter(lambda todoItem:todoItem['ID']!= ID, TodoList))
print(RemoveItem(5, TodoList))
#=> [{'ID': 6, 'TodoItem': 'talk', 'isDone': True}]
這是因為該行l(wèi)ist(filter(lambda todoItem:todoItem['ID']!= ID, TodoList))不會改變列表,而是根據條件提取元素。
但是如果沒有要刪除的項目,最好返回列表本身,而不是返回字符串。

TA貢獻1804條經驗 獲得超7個贊
一個可能的解決方案是找到帶有 id 的項目的索引并使用pop:
todo_list = [{'ID': 5, 'TodoItem': 'walk', 'isDone': False}]
def remove_item(ID):
if not any(todoItem['ID'] == ID for todoItem in todo_list):
return 'item does not exist'
# get index of id
idx = next(i for i, e in enumerate(todo_list) if e['ID'] == ID)
# remove and return
return todo_list.pop(idx)
print(remove_item(4))
print(remove_item(5))
print(todo_list)
輸出
item does not exist
{'isDone': False, 'ID': 5, 'TodoItem': 'walk'}
[]
您第一次嘗試的問題是,當您這樣做時:TodoList=RemovedList在函數內部,它會在函數內部創(chuàng)建一個新的局部變量,即使存在同名的全局變量。在您的第二次嘗試中,您需要設置為全局而不是非本地:
todo_list = [{'ID': 5, 'TodoItem': 'walk', 'isDone': False}]
def RemoveItem(ID):
global todo_list
if not any(todoItem['ID'] == ID for todoItem in todo_list):
return 'item does not exist';
todo_list = list(filter(lambda todoItem: todoItem['ID'] != ID, todo_list))
RemoveItem(5)
print(todo_list)
輸出
[]
添加回答
舉報