'如果找不到,则项目==值:'在python中

时间:2017-10-17 02:01:32

标签: python if-statement

我试图理解以下函数的作用,具体是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的技巧。有人可以具体解释一下吗?

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

  

我的想法是首先确保该值在初始列表中。然后将每个项目与该值进行比较,将不满足条件项目!=值的项目添加到新列表new_items,最后返回新列表。

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

2 个答案:

答案 0 :(得分:1)

found只是一面旗帜;虽然它是Falsenot foundTrue),但您正在针对目标item检查每个value。当您找到匹配项时,将found设置为True,并绕过匹配的项目(continue跳过循环体的其余部分,立即返回循环顶部,所以append没有被调用。)

之后,not found始终为False,并且由于and是短路测试,如果左侧是False,则右侧甚至没有检查过。从那以后,您只需追加所有剩余物品即可。通过使用标志并首先检查它,您:

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

答案 1 :(得分:1)

由于found被初始化为False,这意味着not found被评估为True,所以当我们迭代这些项目时,直到我们找到了我们正在寻找的项目,我们将比较每个item == value,如果它评估为True,我们将进入if正文并执行两项操作:

  1. found的值修改为True:这意味着从现在开始 我们永远不会再次输入if
  2. continue我们将“跳过”添加此项目的部分 结果
  3. 总结一下:当我们在迭代期间遇到value的第一次出现时,我们将翻转标志found的值,我们将跳过添加它的部分到新名单。这将导致将所有项目添加到新列表中。