Python: la mejor manera de eliminar caracteres duplicados de la cadena

¿Cómo puedo eliminar los caracteres duplicados de una cadena usando Python? Por ejemplo, digamos que tengo una cadena:

foo = "SSYYNNOOPPSSIISS" 

¿Cómo puedo hacer la cadena:

 foo = SYNOPSIS 

Soy nuevo en Python y lo que me cansé y está funcionando. Sabía que hay una forma inteligente y mejor de hacer esto … y solo la experiencia puede mostrar esto …

 def RemoveDupliChar(Word): NewWord = " " index = 0 for char in Word: if char != NewWord[index]: NewWord += char index += 1 print(NewWord.strip()) 

NOTA: El orden es importante y esta pregunta no es similar a esta .

Usando itertools.groupby :

 >>> foo = "SSYYNNOOPPSSIISS" >>> import itertools >>> ''.join(ch for ch, _ in itertools.groupby(foo)) 'SYNOPSIS' 

Esta es una solución sin importar itertools:

 foo = "SSYYNNOOPPSSIISS" ''.join([foo[i] for i in range(len(foo)-1) if foo[i+1]!= foo[i]]+[foo[-1]]) Out[1]: 'SYNOPSIS' 

¡Pero es más lento que el otro método!

Qué tal esto:

 oldstring = 'SSSYYYNNNOOOOOPPPSSSIIISSS' newstring = oldstring[0] for char in oldstring[1:]: if char != newstring[-1]: newstring += char 
 def remove_duplicates(astring): if isinstance(astring,str) : #the first approach will be to use set so we will convert string to set and then convert back set to string and compare the lenght of the 2 newstring = astring[0] for char in astring[1:]: if char not in newstring: newstring += char return newstring,len(astring)-len(newstring) else: raise TypeError("only deal with alpha strings") 

Descubrí que la solución con itertools y con la compresión de listas, incluso la solución cuando comparamos el carácter con el último elemento de la lista no funciona

 def removeDuplicate(s): if (len(s)) < 2: return s result = [] for i in s: if i not in result: result.append(i) return ''.join(result) 

Qué tal si

 foo = "SSYYNNOOPPSSIISS" def rm_dup(input_str): newstring = foo[0] for i in xrange(len(input_str)): if newstring[(len(newstring) - 1 )] != input_str[i]: newstring += input_str[i] else: pass return newstring print rm_dup(foo)