小白理解python中remove與del 的區別


leetcode中的題目,感覺之前不太理解,就記錄下來了。

題目:移動零,給定一個數組 nums, 編寫一個函數將所有 0 移動到它的末尾,同時保持非零元素的相對順序(Python3 環境)。

例如:

  1. 必須在原數組上操作,不要為一個新數組分配額外空間。
  2. 盡量減少操作總數

1、在編寫程序過程中,首先想到了remove函數:

class Solution(object):
    def moveZeroes(self, nums):
        for i in range(len(nums)):
            if nums[i]==0:
                nums.remove(nums[i])
                nums.append(0)
        return nums
A=Solution()
print(A.moveZeroes([1,0,0,3]))

結果是對的[1,3,0,0]

2、后面又想到了del函數

class Solution(object):
    def moveZeroes(self, nums):
        for i in range(len(nums)):
            if nums[i]==0:
                del (nums[i])
                nums.append(0)
        return nums
A=Solution()
print(A.moveZeroes([1,0,0,3]))

結果是錯誤的:[1,0,3,0]

3、之前沒有深究過這兩個函數的區別,在這突然想深究一下。

按我們的正常思維考慮一下上面兩個程序,給定列表nums=[1,0,0,3],在for循環中,當i=0時,不作處理;

當i=1時,此時nums[1]=0,刪除nums[1]=0,然后在末尾再添加一個0 ,nums變為nums=[1,0,3,0];

當i=2時,此時nums[2]=3,不作任何處理;

當i=3時,此時nums[3]=0,刪除nums[3]=0,然后在末尾再添加一個0 ,nums變為nums=[1,0,3,0];

由此可以看出,我們所考慮的最后結果和del函數的處理是一樣的,那么remove函數為什么不一樣呢?

原因是:

(1)remove刪除的是首次出現在列表中的元素。在第一個程序中,當i=3時,nums=[1,0,3,0],nums[3]=0,

當執行這一句 nums.remove(nums[3]) 操作時,會首先找到列表中第一次出現的0,將其刪掉。

(2)而del刪除的就是那個索引的元素。在第二個程序中,當i=3時,nums=[1,0,3,0],nums[3]=0,

當執行這一句 nums.remove(nums[3]) 操作時,會將nums[3]在索引3這個位置的元素刪掉。

4、對於第二個程序的調試:

class Solution(object):
    def moveZeroes(self, nums):
        index=0
        for i in range(len(nums)):
            if nums[index]==0:
                del (nums[index])
                nums.append(0)
            else:
                index+=1
        return nums
A=Solution()
print(A.moveZeroes([1,0,0,3]))

注意:i只是對操作次數的循環,在循環中完全可以不用。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM