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).