引题:该题源自一个网友的求助,作为水群龙王的我义不容辞的接下了这道题目,先来看题目:
拿到这道题,题目的意思已经很清楚了,列表里含有2的元素都需要删除,然后输出删除后的新列表。我首先想到的思路就是使用for循环遍历字符串,利用字符串操作符x in s(如果x是s的子串,返回True,否则返回False),使用if函数 ,若为True则删除(remove)该元素。最终输出新列表。
思路代码及运行结果如下(这是错的)
观察输出结果,跟原列表相比虽然剔除了一些含2的元素,但是并没有完全剔除,为什么?
来分析一下python是根据列表元素的下标来遍历的。于是最开始元素123下标为0, 元素212下标为1。第一遍循环执行了s.remove,删除了元素123。当进入第二遍循环时!!!重点来了,注意 此时元素123已经是被删除了, 所以元素212的下标由1变成了0,元素434下标由2变成了1。而下标为0已经在第一遍循环中执行了,故第二遍循环会寻找下标为1的元素。
写到这 想必大家已经知道为什么输出结果中212没有被删除,因为这2货压根就没有被python发现,坐上了前一个元素的位置逃过了例行检查。元素1215为什么也没被删除??因为它下标变成了前面的元素231的位置,逃过了python大哥的例行检查。
好了,出错的原因已经找到了,怎么解决呢?遍历呢就像一条路,你可以从路的起点走到终点,也可以从路的终点走到起点。刚才我们是正序遍历,解决不了问题,那我们倒过来呢?试一下。
倒序遍历的结构可以是这样的: for i in range(len(s)-1,-1,-1)
代码及运行结果如下(这是正确的)
可以看到 我们已经得到了想要输出的结果,关于为什么倒序不会出现问题这里不再过多解释 (因为我不知道怎么解释哈哈哈)只用记住利用for循环遍历删除元素时应该从后往前遍历,否则会出现列表越界的情况。
除了使用remove方法外 我们还有没有别的选择呢?当然是有的咯 python别的不多就是函数超级多。
总结实现列表逆序遍历方法可以有如下几种(还有更多):