List.remove(x):x不在列表中,使用迭代

时间:2014-10-29 20:56:01

标签: python

defecttodelete = [defect for defect in variables.defectlist 
                         if defect.defectorderno == defecttodeleteorderno]

if defecttodelete is not None:
    variables.defectlist .remove(defecttodelete)

使用上面的代码,我想在列表中找到一个对象并将其删除。然而,我得到一个x not in list错误。通常我从该列表中的迭代中获取对象。

2 个答案:

答案 0 :(得分:1)

您正在尝试删除整个列表,该列表不在您的缺陷列表中。相反,你需要这样做:

for item in defecttodelete:
     variables.defectlist.remove(item)

如果您知道要删除的项目列表只包含零个或一个元素,您可以执行以下操作:

if defecttodelete:
    variables.defectlist.remove(defecttodelete[0])

答案 1 :(得分:1)

我建议您只需将列表变量重新分配给新列表,请注意列表理解中唯一的区别是列入逻辑的逻辑反转:

variables.defectlist = [defect for defect in variables.defectlist 
                                   if defect.defectorderno != defecttodeleteorderno]

你也可以在这里使用集合,如果两个集合都有用,顺序无关紧要,元素可以清除。但是既然你正在使用列表,我就不会实现。

但重复使用list.remove并不是很有效。你评论:

  

我想从列表中获取单个对象;基于过滤器。实现这一目标的最佳方法是什么?的lambda?

当我得到正确的元素时,我会使用一个简单的for循环并中断:

for defect in variables.defectlist:
    if defect.defectorderno != defecttodeleteorderno:
        break
else: # runs if no break happens.
    defect = None
    print('no break, defect not found')
print(defect)

如果同样使用next,请小心,如果没有任何内容可以返回,并且您没有默认值,则会引发StopIteration。

>>> next(i for i in [])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

因此,请提供默认的哨兵:

>>> next((i for i in []), None)