在for lis中实现remove方法

2024-04-20 09:49:28 发布

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

我试图理解以下函数的作用,特别是if部分的作用:

def remove(items, value):
    new_items = []
    found = False

    for item in items:
        if not found and item == value:  
            found = True
            continue
        new_items.append(item)
    if not found :
        raise ValueError('list.remove(x): x not in list')

    return new_items

语句if not found and item == value:和变量found的技巧。有人能具体解释一下吗?你知道吗


谢谢,现在我理解了上面的示例代码片段。我可以写代码来实现我的想法

My idea is to first make sure the value is in the initial list . then compare every item with that value, add the item which doesn't satisfy condition item != value to a new list new_items, finally return the new list.

def remove(items, value):
    new_items = []
    for item in items:
        if item == value :
            continue
        else : 
            new_items.append(item)
        if len(items) == len(new_items):
            print("This value is not in the list")
    return new_items

Tags: theinnewforreturnifisvalue
2条回答

found只是一个标志;当它是Falsenot foundTrue)时,您检查每个item与目标value。找到匹配项时,将found设置为True,并绕过匹配的项(continue跳过循环体的其余部分,立即返回循环的顶部,因此不会调用append)。你知道吗

之后,not found总是False,由于and是短路测试,如果左手侧是False,那么右手侧甚至没有检查。从那以后,您只需在运行时附加所有剩余的项。通过使用标志并首先检查它,您可以:

  1. 避免从新创建的list中删除多个value副本
  2. 一旦找到匹配项,就避免比较项的工作(除了测试编译时常量之外,测试not somebool是Python中最便宜的测试),从而使代码速度加快了一点

因为found被初始化为False,这意味着not found被计算为True,所以当我们迭代这些项时,在找到我们要查找的项之前,我们将对每个item == value进行比较,如果它的计算结果为True,我们将进入if主体并执行两件事情:

  1. found的值修改为True:这意味着从现在开始 我们再也不会进入if块了
  2. continue我们将“跳转”到添加此项的部分 找到

总而言之:当我们在迭代过程中遇到第一个出现的value时,我们将翻转标志found的值,并跳过将其添加到新列表的部分。这将导致将所有此项添加到新列表中。你知道吗

相关问题 更多 >