2016-12-20 15 views
0

Ich versuche, ein Programm für ein bestimmtes Array und einen Wert zu schreiben, alle Instanzen dieses Werts an Ort und Stelle zu entfernen und die neue Länge zurückzugeben.Python-Array-Slice funktioniert nicht wie erwartet

Beispiel: gegebener Eingang Array nums = [3,2,2,3], val = 3

Es sollte zurückkehren Länge = 2 ist, mit den ersten beiden Elementen nums wobei 2.

hier ist mein Code:

Code 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:]) 

Dies gibt den Array-Slice in umgekehrter Reihenfolge.

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

Allerdings, wenn ich am Ende des Codes 1 geringfügige Änderungen vornehmen, gibt es mir die korrekte Ausgabe:

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

Code 2:

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) 

Ich kippe finde heraus, warum mein Code 1 nicht funktioniert. Könnte jemand mir helfen zu verstehen, warum Slice nicht wie erwartet funktioniert?

+1

Ich glaube nicht, dass beide Ansätze funktionieren, es sei denn, Sie haben eine Einschränkung für die Eingabe, die Sie nicht erwähnt haben. –

+0

Die seltsame Sache ist, dass ich Ihren Code1 lief und es wie erwartet funktioniert, d. H. Mit Eingabe [3,2,2,3] gibt [2,2] und Länge 2 zurück – Nurjan

Antwort

2

Dies würde das tun, was Sie beabsichtigen, ("... alle Instanzen dieses Wertes anstelle entfernen und die neue Länge zurückzukehren"):

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

Test:

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

Ausgang:

2 
[2, 2] 
+0

Löst dies Ihr Problem? –

0

Ihr erstes Beispiel funktioniert.

Wenn Sie Slice eine neue Liste erstellt wird. In Ihrem ersten Codebeispiel erstellen Sie am Ende eine neue Liste, die das korrekte Ergebnis enthält, aber es nie zurückgibt.

In Ihrem zweiten Codebeispiel ordnen Sie die neu erstellte Liste der ursprünglichen Liste zu und können somit auf das Endergebnis zugreifen.

Verwandte Themen