Python: ¿cómo eliminar duplicados solo si son consecutivos en una cadena?

Para una cadena como '12233322155552' , al eliminar los duplicados, puedo obtener '1235' .

Pero lo que quiero mantener es '1232152' , solo eliminando los duplicados consecutivos.

Tipo de pregunta de entrevista de trabajo de Microsoft / Amazon: Este es el pseudocódigo, el código real se deja como ejercicio.

 for each char in the string do: if the current char is equal to the next char: delete next char else continue return string 

Como nivel más alto, intente (no en realidad la implementación):

 for s in string: if s == s+1: ## check until the end of the string delete s+1 
 import re answer = re.sub(r'(\d)\1+', r'\1', '12233322155552') 

Puedes usar itertools , aquí está el forro

 >>> s = '12233322155552' >>> ''.join(i for i, _ in itertools.groupby(s)) '1232152' 

Pista: el módulo de itertools es super-útil. Una función en particular, itertools.groupby , puede ser realmente útil aquí:

itertools.groupby (iterable [, tecla])

Haga un iterador que devuelva claves y grupos consecutivos del iterable. La clave es una función que calcula un valor clave para cada elemento. Si no se especifica o es Ninguno, la clave se establece de manera predeterminada en una función de identidad y devuelve el elemento sin cambios. En general, el iterable debe estar ya ordenado en la misma función clave.

Entonces, como las cadenas son iterables, lo que podrías hacer es:

 use groupby to collect neighbouring elements extract the keys from the iterator returned by groupby join the keys together 

que se puede hacer todo en una línea limpia …

En primer lugar, no puede eliminar nada de una cadena en Python (google “Python immutable string” si esto no está claro).

El primer acercamiento de M sería:

 foo = '12233322155552' bar = '' for chr in foo: if bar == '' or chr != bar[len(bar)-1]: bar += chr 

o, usando la sugerencia de itertools de arriba:

 ''.join([ k[0] for k in groupby(a) ]) 

+1 para groupby. Fuera de la manga, algo como:

 from itertools import groupby def remove_dupes(arg): # create generator of distinct characters, ignore grouper objects unique = (i[0] for i in groupby(arg)) return ''.join(unique) 

Cocina para mí en Python 2.7.2.

 number = '12233322155552' temp_list = [] for item in number: if len(temp_list) == 0: temp_list.append(item) elif len(temp_list) > 0: if temp_list[-1] != item: temp_list.append(item) print(''.join(temp_list)) 

Esta sería una manera:

 def fix(a): list = [] for element in a: # fill the list if the list is empty if len(list) == 0:list.append(element) # check with the last element of the list if list[-1] != element: list.append(element) print(''.join(list)) a= 'GGGGiiiiniiiGinnaaaaaProtijayi' fix(a) # output => GiniGinaProtijayi 
 t = '12233322155552' for i in t: dup = i+i t = re.sub(dup, i, t) 

Puede obtener la salida final como 1232152