我有这段代码:
numbers = range(1, 50)
for i in numbers:
if i < 20:
numbers.remove(i)
print(numbers)
但我得到的结果是:
[2、4、6、8、10、12、14、16、18、20、21、22、23、24、25、26、27、28、29、30、31、32、33、34、35 ,36、37、38、39、40、41、42、43、44、45、46、47、48、49]
当然,我期望低于20的数字不会出现在结果中,我假设我对删除操作做错了什么。
在遍历列表时,你正在修改它。这意味着第一次遍历循环时,i==1,因此1从列表中删除。然后for循环转到列表中的第二项,不是2,而是3!然后从列表中删除,然后for循环转到列表中的第三项,现在是5。等等。也许这样更容易想象,用^
表示i
的值:
[1, 2, 3, 4, 5, 6...]
^
最初是列表的状态;然后删除1,然后循环转到列表中的第二项:
[2, 3, 4, 5, 6...]
^
[2, 4, 5, 6...]
^
等等。
在迭代列表时,没有很好的方法来更改列表的长度。你可以做的最好的事情是这样的:
numbers = [n for n in numbers if n >= 20]
或这样,就地更改(parens中的内容是一个生成器表达式,在切片分配之前隐式转换为元组):
numbers[:] = (n for in in numbers if n >= 20)
如果要在删除n之前对n执行操作,可以尝试的一种技巧是:
for i, n in enumerate(numbers):
if n < 20 :
print "do something"
numbers[i] = None
numbers = [n for n in numbers if n is not None]
我正在使用ListView。向ListView添加新项很容易,但如何删除? 我通过以下方式构建ListView: Listcell Y的一个实例在setGraphics中设置了一个标签。要从我的观察列表中删除与之关联的字符串,我添加了一个MouseEvent处理程序: 虽然这段代码通过从ObservableList中删除每个单击的项目来工作,但listView的行为很奇怪。每次单击标签时,它都会成
这些数字是,这正是我所期望的。 我完全搞不懂这两个案子的情况。有人能解释清楚吗?
问题内容: 在遍历列表时,我想根据条件删除列表中的项。请参见下面的代码。 这给了我一个例外。 如何才能做到这一点? 问题答案: 您需要使用和调用上,而不是使用循环。
在我的应用程序中,左侧有一个,我根据中的选择更新右侧的窗格。一个非常直接的场景。当选择为空时,我会在窗格中显示类似“请进行选择”的消息,即我也会在 ,以防用户单击某些。侦听器还附加到所选的的,以防用户没有单击某些项目,但所选项目的值因某种原因而更改。用户可以通过单击其中的删除按钮来删除特定项目。在任何时候,用户可以点击更新按钮来更新显示当前选择的标签内容,以防我的处理程序错过了一些事件。 在这个简
问题内容: Python如何在迭代时从列表中删除项目? 问题答案: 你可以使用列表推导来创建一个仅包含你不想删除的元素的新列表: 或者,通过分配给,你可以将现有列表突变为仅包含所需的项目: 如果还有其他引用somelist需要反映更改,则此方法可能很有用。 除了理解之外,你还可以使用itertools。在Python 2中: 或在Python 3中:
问题内容: 我在Python中有一个列表列表: 我想从中删除重复的元素。如果这是正常列表,而不是我可以使用的列表set。但不幸的是,该列表不可散列,因此无法建立一组列表。只有元组。因此,我可以将所有列表转换为元组,然后使用set并返回列表。但这不是很快。 如何以最有效的方式做到这一点? 上面的结果应为: 我不在乎保留订单。 注意:这个问题很相似,但不是我所需要的。搜索了SO,但没有找到确切的重复项