今天遇到了一个问题,比如我们有如下一个列表:

list1 = [-1, 0, 1, 2]

我们想要删除其中所有小于​​1​​​的元素,即删除​​-1​​​和​​0​​​这两个元素。
最简单的方法为逐个删除,代码如下:

list1 = [-1, 0, 1, 2]
list1.remove(-1)
list1.remove(0)
print(list1)
"""
result:
[1, 2]
"""

可以看到我们如愿地删除掉了这两个元素,然而这远远不够,因为现在列表一共四个元素,需要删除的元素也只有两个,因此我们可以手动删除。如果我们的列表有​​10000​​​个元素,并且需要删除的有几百个,显然这个时候我们无法再手动一一删除了,因此我们考虑使用循环加​​if​​语句来完成。代码如下:

list1 = [-1, 0, 1, 2]
for i in list1:
if i <= 0:
list1.remove(i)
print(list1)
"""
result:
[0, 1, 2]
"""

我们的代码逻辑毫无问题,然而最终的结果是我们并没能够删除​​0​​​这个元素。这是因为当我们第一次删除​​-1​​​这个元素时,循环向下执行,然而由于此时列表内的总元素个数从​​4​​​个变为了​​3​​​个,因此循环的索引值会直接跳过​​0​​​这个元素。因此​​0​​​未能触发​​if​​​比较语句,最终导致​​0​​​没有能够被删除。
因此我们可以得到一条重要的结论,列表在进行循环遍历时不应该同时进行改变列表长度的操作(增删操作)。进一步推广,我们可以得到结论,在​​Python​​中,可迭代对象在进行循环遍历时不应该进行增删操作

其实这个并不是绝对的,我们可以在外部加一层循环来改变这个情况,以后再说,但是我们还是应该要避免这种操作。

那么我们该如何解决这个问题呢?我们可以通过创建一个新列表来解决这一问题。代码如下:

list1 = [-1, 0, 1, 2]
list2 = []
for i in list1:
if i >= 1:
list2.append(i)
print(list2)
"""
result:
[1, 2]
"""

至此,我们实现了去掉列表中小于某个特定值的所有值的算法,但是这么写并不美观。我们可以使用列表推导式来完成上述同样的操作。

list1 = [-1, 0, 1, 2]
list2 = [i for i in list1 if i > 0]
print(list2)
"""
result:
[1, 2]
"""

完美,我们使用一行代码实现了这一小算法。

码字不易,如果大家觉得有用,请高抬贵手给一个赞让我上推荐让更多的人看到吧~