zoukankan      html  css  js  c++  java
  • ⚠️ Python 循环列表删除元素的注意事项

     错误示范:

     1 class Solution:
     2     def removeElement(self, nums, val: int) -> int:
     3         for i, num in enumerate(nums):
     4             print('i=', i, ', num=', num, ', nums=', nums)
     5             if num == val:
     6                 nums.remove(val)
     7         return len(nums)
     8 
     9 s = Solution()
    10 s.removeElement([2, 0,1,2,2,3,0,4,2], 2)
    11 # i= 0 , num= 2 , nums= [2, 0, 1, 2, 2, 3, 0, 4, 2]
    12 # i= 1 , num= 1 , nums= [0, 1, 2, 2, 3, 0, 4, 2]
    13 # i= 2 , num= 2 , nums= [0, 1, 2, 2, 3, 0, 4, 2]
    14 # i= 3 , num= 3 , nums= [0, 1, 2, 3, 0, 4, 2]
    15 # i= 4 , num= 0 , nums= [0, 1, 2, 3, 0, 4, 2]
    16 # i= 5 , num= 4 , nums= [0, 1, 2, 3, 0, 4, 2]
    17 # i= 6 , num= 2 , nums= [0, 1, 2, 3, 0, 4, 2]

    解决方式:

    ① 使用尾递归方式

     1 class Solution:
     2     def removeElement(self, nums, val: int) -> int:
     3         for i, num in enumerate(nums[::-1]):
     4             print('i=', i, ', num=', num, ', nums=', nums)
     5             if num == val:
     6                 nums.remove(val)
     7         return len(nums)
     8 
     9 s = Solution()
    10 s.removeElement([2, 0,1,2,2,3,0,4,2], 2)
    11 # i= 0 , num= 2 , nums= [2, 0, 1, 2, 2, 3, 0, 4, 2]
    12 # i= 1 , num= 4 , nums= [0, 1, 2, 2, 3, 0, 4, 2]
    13 # i= 2 , num= 0 , nums= [0, 1, 2, 2, 3, 0, 4, 2]
    14 # i= 3 , num= 3 , nums= [0, 1, 2, 2, 3, 0, 4, 2]
    15 # i= 4 , num= 2 , nums= [0, 1, 2, 2, 3, 0, 4, 2]
    16 # i= 5 , num= 2 , nums= [0, 1, 2, 3, 0, 4, 2]
    17 # i= 6 , num= 1 , nums= [0, 1, 3, 0, 4, 2]
    18 # i= 7 , num= 0 , nums= [0, 1, 3, 0, 4, 2]
    19 # i= 8 , num= 2 , nums= [0, 1, 3, 0, 4, 2]
    View Code

     ② 使用 while 循环的方式

     1 class Solution:
     2     def removeElement(self, nums, val: int) -> int:
     3         i = 0
     4         while i < len(nums):
     5             print('i=', i, ', num=', nums[i], ', nums=', nums)
     6             if nums[i] == val:
     7                 nums.pop(i)
     8             else:
     9                 i += 1
    10         return len(nums)
    11 
    12 s = Solution()
    13 s.removeElement([2, 0,1,2,2,3,0,4,2], 2)
    14 # i= 0 , num= 2 , nums= [2, 0, 1, 2, 2, 3, 0, 4, 2]
    15 # i= 0 , num= 0 , nums= [0, 1, 2, 2, 3, 0, 4, 2]
    16 # i= 1 , num= 1 , nums= [0, 1, 2, 2, 3, 0, 4, 2]
    17 # i= 2 , num= 2 , nums= [0, 1, 2, 2, 3, 0, 4, 2]
    18 # i= 2 , num= 2 , nums= [0, 1, 2, 3, 0, 4, 2]
    19 # i= 2 , num= 3 , nums= [0, 1, 3, 0, 4, 2]
    20 # i= 3 , num= 0 , nums= [0, 1, 3, 0, 4, 2]
    21 # i= 4 , num= 4 , nums= [0, 1, 3, 0, 4, 2]
    22 # i= 5 , num= 2 , nums= [0, 1, 3, 0, 4, 2]
    View Code

     ③ 对整个序列使用切片来创建一个临时副本

     1 class Solution:
     2     def removeElement(self, nums, val: int) -> int:
     3         for i, num in enumerate(nums[:]):
     4             print('i=', i, ', num=', num, ', nums=', nums)
     5             if num == val:
     6                 nums.remove(val)
     7         return len(nums)
     8 
     9 s = Solution()
    10 s.removeElement([2, 0,1,2,2,3,0,4,2], 2)
    11 # i= 0 , num= 2 , nums= [2, 0, 1, 2, 2, 3, 0, 4, 2]
    12 # i= 1 , num= 0 , nums= [0, 1, 2, 2, 3, 0, 4, 2]
    13 # i= 2 , num= 1 , nums= [0, 1, 2, 2, 3, 0, 4, 2]
    14 # i= 3 , num= 2 , nums= [0, 1, 2, 2, 3, 0, 4, 2]
    15 # i= 4 , num= 2 , nums= [0, 1, 2, 3, 0, 4, 2]
    16 # i= 5 , num= 3 , nums= [0, 1, 3, 0, 4, 2]
    17 # i= 6 , num= 0 , nums= [0, 1, 3, 0, 4, 2]
    18 # i= 7 , num= 4 , nums= [0, 1, 3, 0, 4, 2]
    19 # i= 8 , num= 2 , nums= [0, 1, 3, 0, 4, 2]
    View Code

  • 相关阅读:
    十天学会php之第一天
    学习PHP的一些经验
    PHP中的数据类型(1)
    PHP中的常量
    赵凡导师并发知识第一次分享观后感
    面向对象之 __setitem__()、__getitem__()、__delitem__() 用法
    spider数据抓取(第二章)
    识别网站所用技术
    scrapy安装要求
    基于bs4的防止xss攻击,过滤script标签
  • 原文地址:https://www.cnblogs.com/catyuang/p/11121663.html
Copyright © 2011-2022 走看看