defecttodelete = [defect for defect in variables.defectlist
if defect.defectorderno == defecttodeleteorderno]
if defecttodelete is not None:
variables.defectlist .remove(defecttodelete)
使用上面的代码,我想在列表中找到一个对象并将其删除。然而,我得到一个x not in list错误。通常我从该列表中的迭代中获取对象。
答案 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)