2016-12-20 11 views
0

私は、指定された配列と値のすべてのインスタンスを削除し、新しい長さを返すために、ある配列と値のプログラムを作成しようとしています。Python配列のスライスが期待どおりに動作しない

例: 所与の入力アレイNUMSの= [3,2,2,3]、ヴァル= 3

それはNUMSの最初の2つの要素が2

された状態で、長さ= 2を返すべきここに私のコードは次のとおりです。

コード1:

def removeElement(self, nums, val): 
    """ 
    :type nums: List[int] 
    :type val: int 
    :rtype: int 
    """ 
    i = 0 
    j = len(nums) - 1 

    while i <= j: 
     while i <= j and nums[j] != val: 
      j -= 1 

     while i <= j and nums[i] == val: 
      i += 1 

     if i <= j: 
      nums[i], nums[j] = nums[j], nums[i] 

    return len(nums[i:]) 

は、これが逆の順序で配列スライスを返します。私はカント

def removeElement(self, nums, val): 
    """ 
    :type nums: List[int] 
    :type val: int 
    :rtype: int 
    """ 
    i = 0 
    j = len(nums) - 1 

    while i <= j: 
     while i <= j and nums[j] != val: 
      j -= 1 

     while i <= j and nums[i] == val: 
      i += 1 

     if i <= j: 
      nums[i], nums[j] = nums[j], nums[i] 

    nums[:] = nums[i:] 
    return len(nums) 

nums[:] = nums[i:] 
    return len(nums[i:]) 

はコード2:私は、コード1の終了時に若干の修正を加えた場合

Input: 
[3,2,2,3] 
3 
Output: [3,3] 
Expected: [2,2] 

はしかし、それは私に正しい出力を提供します私のコード1がうまくいかない理由を理解してください。スライスが期待どおりに機能しない理由を誰かに教えてもらえますか?

+1

あなたが言及していない入力に対して何らかの制限がない限り、いずれのアプローチもうまくいくとは思わない。 –

+0

奇妙なことは、私はあなたのcode1を実行し、予想どおりに働いたことです。すなわち、入力[3,2,2,3]が[2,2]と長さ2を返します。 – Nurjan

答えて

2

これは、あなたが( "...場所で、その値のすべてのインスタンスを削除し、新しい長さを返す")つもり何だろう:

def remove_element(nums, val): 
    nums[:] = [x for x in nums if x != val] 
    return len(nums) 

テスト:

nums = [3, 2, 2, 3] 
val = 3 
print(remove_element(nums, val)) 
print(nums) 

出力:

2 
[2, 2] 
+0

これで問題は解決しますか? –

0

最初の例が有効です。

スライスすると新しいリストが作成されます。したがって、最初のコードサンプルでは、​​末尾にの正しい結果を含む新しいリストを作成していますが、返さないでください。結果

2番目のコード例では、新しく作成したリストを元のリストに割り当てているため、最終結果にアクセスできます。

関連する問題