Remove values from an array in-place
Two easy and neat little algorithms to remove values (say ‘x’) from an array in-place (without allocating space for a new array).
The first idea is that I don’t need to sheft any element before the first ‘x’; I need to shift elements between the first ‘x’ and the second ‘x’ one place to the left, and so on.
def remove_element(value,array):
shift = 0
for index in xrange(len(array)):
try:
array[index] = array[index + shift]
while array[index] == value:
shift += 1
array[index] = array[index + shift]
except IndexError:
array[index] = None
The second idea is to have two indeces, one for reading and one for writing, both starting at the begin of the array. I move them both forward for characters different than ‘x’; when char is ‘x’, only the reading index is moved forward.
def remove_element(value, array):
reading_idx = writing_idx = 0
while reading_idx < len(array):
if array[reading_idx] != value:
array[writing_idx] = array[reading_idx]
writing_idx += 1
reading_idx += 1
while writing_idx < len(array):
array[writing_idx] = None
writing_idx += 1
(source here).