我无法从另一个列表的列表中删除一组已使用的数字。
问题出现的原因是想要从一个列表的列表中删除一组已使用的数字,但是不知道如何实现。文章提供了两种解决方法。
第一种方法是构建一个新的列表,其中只包含想要的项。可以使用列表推导式来实现:
L[:] = [el for el in L if el != 3]
这个列表推导式构建了所需的列表,并将其赋值给整个列表切片L[:]
,确保不仅仅是重新绑定一个名称,而是完全替换了内容,因此效果与所需的“删除”是完全相同的。这种方法也很快速。
如果非常坚决地想要进行删除操作,可以使用一种巧妙的方法:
>>> ndel = 0 >>> for i, el in enumerate(list(L)): ... if el==3: ... del L[i-ndel] ... ndel += 1
这种方法没有列表推导式那么优雅、简洁和高效,但可以实现目标(尽管其正确性一开始看起来并不明显,事实上在编辑之前我弄错了!)。这里的“不惜一切代价”就适用了。
如果一定要进行删除操作,可以使用遍历索引的方式,而不是遍历元素,但要记得在这种情况下要反向遍历索引:
for i in reversed(range(len(L))): if L[i] == 3: del L[i]
实际上,这是reversed
内置函数添加到Python中时的一个主要用例,当时我们正在讨论是否添加这个函数。没有reversed
,很难获得reversed(range(...
,而且以反向顺序遍历列表有时是有用的。另一种方式
for i in range(len(L) - 1, -1, -1):
非常容易出错。
尽管有其他可行的方法,但刚开始推荐的列表推导式看起来越来越好,对吧?
这是一个不错的想法,我没有想到。谢谢你,Alex!:)
第二种方法在有多个要删除的元素时会删除错误的元素,因为第一次删除后索引会改变。