【3-12】为什么采用倒序的方式能够解决删除时的覆盖问题

【3-12】为什么采用倒序的方式能够解决删除时的覆盖问题

list_1 = [3, 6, 8, 9, 25, 36, 100, 105]
for item in list_1[::-1]:
if (item%2==0):
print(item)
list_1.remove(item)
print(list_1)
print("--------")
print(list_1)

老师,

    ​我没有明白为什么这里采用倒序的方式可以解决删除列表内元素时的覆盖问题

    ​不明白for循环内部是如何遍历list_1[::-1]这个iterable的。

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学,你好!下面分别回答同学的两个问题:
1. 倒序:当执行到100时满足条件删除后,105会覆盖掉100的位置,是因为倒序,会继续向前判断,并不会覆盖没判断的元素,所以不会影响
2. for循环,打印出倒叙的顺序,105是奇数,不可以被2整除,则打印输出,100是偶数,可以被2整除,则remove移出100,以此类推,同学可结合下面代码示例进行理解:

http://img1.sycdn.imooc.com//climg/6046dc5209c5705805320818.jpg
祝:学习愉快!


  • 三姐四哥五弟 提问者 #1

    老师好,

        ​我想换种问法:for循环在遍历列表时是如何进行的?

        ​我理解的先前正向取数据时,是按照列表索引来进行的,

        ​之所以遗漏8,是因为,取到1索引的时候,去掉了6,8替代掉了6的位置,8变成了1索引,再进行下一次for循环的时候,应该判断2索引了,2索引此时为9,所以就遗漏了8.

        ​但我不理解,倒序取数据的方式,按照上面这种说法,倒序取按照-1 -2 -3索引取的话不是也会存在覆盖问题嘛?

    2021-03-09 12:39:30
  • 同学,你好!倒叙从倒数第一个元素开始判断,偶数删除后奇数覆盖掉其位置,for循环会继续进行判断,并不影响删除位置之前的元素
    祝:学习愉快!

    2021-03-09 14:26:04
  • 同学,你好!倒叙从倒数第一个元素开始判断,偶数删除后奇数覆盖掉其位置,for循环会继续进行判断,并不影响删除位置之前的元素,使用list_1[::-1]可以理解为复制一个列表,删除元素时删除的是list_1中的,并不会影响for循环执行

    1. 105是奇数不能被2整除,则保留在列表里,列表里元素没有改变,参考数字1

    2. 继续判断,第二个元素是100,是一个偶数,可以被2整除,则删除,100位置则为空,105则会向前进一位覆盖100空的位置,列表里面元素减少一位,参考数字2

    3. 继续判断,36是偶数能被2整除,36位置为空,105则再会向前进一位覆盖了36空的位置,列表里面的元素减少两位,参考数字3

    4. 继续判断,25是奇数不能被2整除,保留在列表里,列表元素还是停留在上一个循环结果,只减少了两位,参考数字4

    5. 继续判断,9是奇数不能被2整除,保留在列表里,列表元素还是停留在上上一个循环结果,只减少了两位,参考数字5

    6. 继续判断,8是偶数可以被2整除,8位置为空,9会向前进一位覆盖了8空的位置,列表里面的元素减少了三位,参考数字6

    7. 继续判断,6是偶数可以被2整除,6位置为空,9会向前进一位覆盖了6空的位置,列表里面的元素减少了四位,参考数字7

    8. 3是奇数不能被2整除,保留在列表里,此时列表里只有4个奇数,参考数字8

    http://img1.sycdn.imooc.com//climg/604709aa09220e5d03900551.jpg
    祝:学习愉快!

    2021-03-09 14:34:17
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师