我无法从另一个列表的列表中删除一组已使用的数字。

8 浏览
0 Comments

我无法从另一个列表的列表中删除一组已使用的数字。

给定一个数字列表:

L = [1, 2, 3, 4, 5]

在遍历列表时,我该如何删除一个元素,比如说3?

我尝试了下面的代码,但它并没有实现:

for el in L:
    if el == 3:
        del el

0
0 Comments

问题出现的原因是想要从一个列表的列表中删除一组已使用的数字,但是不知道如何实现。文章提供了两种解决方法。

第一种方法是构建一个新的列表,其中只包含想要的项。可以使用列表推导式来实现:

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!:)

第二种方法在有多个要删除的元素时会删除错误的元素,因为第一次删除后索引会改变。

0
0 Comments

问题的出现原因:代码中使用了循环遍历列表L,并在循环中判断如果元素等于2,则删除列表L中的该元素。然而,在循环中直接删除元素会导致索引发生改变,从而影响后续的遍历和删除操作。

解决方法:使用enumerate函数来遍历列表L,并获取元素的索引值,然后根据索引值删除元素。

以下是修改后的代码:

for idx, el in enumerate(L):
    if el == 2:
        del L[idx]

这样,就能够正确地删除列表L中所有等于2的元素,而不会出现索引错误或遗漏元素的情况。

0