为了账号安全,请及时绑定邮箱和手机立即绑定

更改范围外的列表

更改范围外的列表

红糖糍粑 2021-09-25 17:04:15
我正在尝试从列表中删除一个项目,如下所示:TodoList=[{'ID':5,'TodoItem':'walk','isDone':False}];def RemoveItem(ID):     if not any(todoItem['ID'] == ID for todoItem in TodoList):          return 'item does not exist';     RemovedList=list(filter(lambda todoItem:todoItem['ID']!= ID,TodoList))     TodoList=RemovedList不起作用,我也试过这个: def RemoveItem(ID):         nonlocal TodoList         if not any(todoItem['ID'] == ID for todoItem in TodoList):              return 'item does not exist';         TodoList=list(filter(lambda todoItem:todoItem['ID']!= ID,TodoList))有谁知道问题是什么?
查看完整描述

2 回答

?
慕哥9229398

TA贡献1877条经验 获得超6个赞

一种可能的解决方法。


将待办事项列表(字典列表)作为参数传递,因此它会发生变化:


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}]

这是因为该行list(filter(lambda todoItem:todoItem['ID']!= ID, TodoList))不会改变列表,而是根据条件提取元素。


但是如果没有要删除的项目,最好返回列表本身,而不是返回字符串。


查看完整回答
反对 回复 2021-09-25
?
三国纷争

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在函数内部,它会在函数内部创建一个新的局部变量,即使存在同名的全局变量。在您的第二次尝试中,您需要设置为全局而不是非本地:


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)

输出


[]


查看完整回答
反对 回复 2021-09-25
  • 2 回答
  • 0 关注
  • 131 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信