Python在遍历列表后删除列表中一半的元素
我完全被这个问题难住了: 我有以下python代码:Python在遍历列表后删除列表中一半的元素,python,list,python-2.7,Python,List,Python 2.7,我完全被这个问题难住了: 我有以下python代码: def remove(self, widgets): for widget in widgets: widget_found = False for widget_sig in self.widgets: if widget_sig.id == widget: #remove all objects from selected widget
def remove(self, widgets):
for widget in widgets:
widget_found = False
for widget_sig in self.widgets:
if widget_sig.id == widget:
#remove all objects from selected widget
widget_found = True
to_remove = widget_sig.objs
for obj in to_remove:
#objs are all intances of oo_canvas classes
obj.destroy()
self._build(widget, obj)
if not widget_found:
#if we iterated through the entire list and still couldn't find anything
raise mockingbird_errs.InternalMockingbirdError("The requested widget was not registered with this builder: "+str(widget))
这应该很直截了当。问题是,它永远不会通过迭代来正确删除。出于某种原因,它跳过了所有其他元素。更令人困惑的是,如果我让它在for循环前后打印要删除的长度,它会打印254和127。嗯?据我所知,遍历列表并不涉及删除所有其他元素
我是不是错过了一些简单的东西?到底发生了什么事
。。。它跳过所有其他元素
这是因为你不断删除它们,将列表缩短了1。然后继续下一个索引。要么向后工作,要么迭代列表的副本
。。。它跳过所有其他元素
这是因为你不断删除它们,将列表缩短了1。然后继续下一个索引。要么向后工作,要么迭代列表副本。obj.destroy()在做什么???obj.destroy()将类中的一个属性从False更改为True。稍后,将在obj上调用另一个方法,该方法实际收集并使用数据。你在向我们隐瞒细节!如果确实要删除一半的
列表
(而不是只删除一个元素),通常最好只创建一个新的列表
,其中包含要保留的元素。这并不是在所有情况下都有效(例如,如果其他人持有对同一列表的引用,并且需要查看更改),但当它发生时,更容易推理,通常代码更简单,效率更高。我将很快澄清。我并没有试图删除一半的列表。我试图在不删除任何内容的情况下遍历整个列表。无论如何,我通过先复制列表解决了这个问题。obj.destroy()在做什么???obj.destroy()将类中的一个属性从False更改为True。稍后,将在obj上调用另一个方法,该方法实际收集并使用数据。你在向我们隐瞒细节!如果确实要删除一半的列表
(而不是只删除一个元素),通常最好只创建一个新的列表
,其中包含要保留的元素。这并不是在所有情况下都有效(例如,如果其他人持有对同一列表的引用,并且需要查看更改),但当它发生时,更容易推理,通常代码更简单,效率更高。我将很快澄清。我并没有试图删除一半的列表。我试图在不删除任何内容的情况下遍历整个列表。不管怎样,我通过先复制列表解决了这个问题。我确实尝试了对副本进行迭代,这就解决了这个问题。谢谢。怎么做?我确实试着在副本上迭代,这就解决了问题。谢谢,怎么做?