2017-02-18 60 views
1

寫一個python程序從數組中刪除VAL: 第一個程序是:蟒:兩個程序從NUMS刪除VAL

class Solution(object): 
    def removeElement(self,nums,val): 

     for x in nums: 
      if x == val: 
       nums.remove(val) 
     return len(nums) 

當NUMS是[3,3],則val爲3,輸出爲:1個

第二程序是:

class Solution(object): 
    def removeElement(self,nums,val): 

     while val in nums: 
      nums.remove(val) 
     return len(nums) 

的NUMS是[3,3],則val爲3,輸出是:0

請問能否告訴我區別和原因

+0

從數組中循環移除元素時通常會引起奇怪的行爲和問題。 –

回答

1

Python很難在迭代期間迭代通過改變的東西。它可能會失敗或返回意外的結果,或永遠不會退出迭代。

由於容器甚至沒有保持跟蹤外出 就可以了,甚至勾改變法要少得多遍歷每一個這樣的 迭代器,並神奇地讓每一個迭代瞭解 改變迭代器。這將是一個很微妙,複雜的代碼,並檢查減緩非常頻繁的操作。

nums=[3,4] 
val=3 

for x in nums: 
    print(x,nums) 
    if x > val: 
     nums.append(4) 

上面的代碼將不會退出iteration.So正確的方法是使用列表理解來創建一個僅包含元素的新名單,你不想刪除:

print([i for i in nums if i!=val]) 

或就地改造:

nums[:] = [i for i in nums if i!=val] 

希望這有助於。

0

在第一個示例中,您將迭代列表中的元素時刪除列表中的元素。這是一個問題,因爲在第一個remove之後你會用完迭代。

如果列表,例如,l = [1, 1, 2, 2]你第一2後調用removeElement(l, 2)被刪除的l長度爲3至不會有任何留下迭代(列表會[1, 1, 2],你會在第3次迭代中,這就是循環停止的原因,並且返回[1, 1, 2])。

在第二種情況下,while語句是:雖然列表中仍有2,但繼續從列表中刪除2。這樣,在第一次迭代之後,l看起來像[1, 1, 2],並且它內部仍然有2個,所以循環繼續並且您得到[1, 1]

您可以將此示例應用於您的案例l = [3, 3]並查看您是否瞭解它。

希望幫助:)