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

  • 相关阅读:
    我的第一个博客在博客园安家了,哈哈~欢迎大家光临
    JS未设置对象问题解决方案
    关于Oracle的优化
    USACO 1.2 Milking Cows
    C语言的文件操作 freopen
    USACO 1.2 Palindromic Squares
    USACO 1.1 Broken Necklace
    ACM征程再次起航!
    USACO 1.3 Barn Repair
    USACO 1.2 Transformations
  • 原文地址:https://www.cnblogs.com/catyuang/p/11121663.html
Copyright © 2011-2022 走看看