2012-03-23 22 views
23

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

foo = 'mppmt' 

¿Cómo puedo hacer que la cadena:

foo = 'mpt' 

NOTA: El orden no es importante

+2

Ejem ... http://stackoverflow.com/questions/636977/best-way-to-remove-duplicate-characters-words-in-a-string – nullpotent

+1

@ AljoshaBre: use el botón 'cerrar' y seleccione 'cerrar como objeto' y proporcione ese enlace. Gracias –

+2

@AljoshaBre Ninguna de estas respuestas está garantizada para mantener el orden. – Marcin

Respuesta

49

Si el orden no importa, puede utilizar

"".join(set(foo)) 

set() creará un conjunto de letras únicas en la cadena, y "".join() unirá las letras a una cadena en orden arbitrario.

Si el orden hace cuestión, puede utilizar collections.OrderedDict en Python 2.7:

from collections import OrderedDict 
foo = "mppmt" 
print "".join(OrderedDict.fromkeys(foo)) 

impresión

mpt 
+2

+1: 'fromkeys()' no se usa con mucha frecuencia, pero aquí se le da un uso excelente. – EOL

+0

+1 Excelente uso de 'fromkeys()' –

1

Si el orden no es el asunto:

>>> foo='mppmt' 
>>> ''.join(set(foo)) 
'pmt' 

Para mantener la orden:

>>> foo='mppmt' 
>>> ''.join([j for i,j in enumerate(foo) if j not in foo[:i]]) 
'mpt' 
0

Si el orden es importante,

seen = set() 
result = [] 
for c in foo: 
    if c not in seen: 
     result.append(c) 
     seen.add(c) 
result = ''.join(result) 

O hacerlo sin conjuntos:

result = [] 
for c in foo: 
    if c not in result: 
     result.append(c) 
result = ''.join(result) 
+1

@Marcin: No lo entiendo en absoluto. ¿No siempre c estará en el set (foo)? – DSM

+0

@Marcin Eso siempre devolverá una cadena vacía. Cada c en foo está en conjunto (foo) –

+1

@DSM/Kevin. Lo bueno es que no lo publiqué como una respuesta. 'seen = set(); '' .unirse (visto.añadir (c) o c para c en foo si c no se ve) '. Es un viernes implícito, es mejor que explícito. – Marcin

26

Si el orden hace cuestión, ¿qué tal:

>>> foo = 'mppmt' 
>>> ''.join(sorted(set(foo), key=foo.index)) 
'mpt' 
+6

sucinto y legible. Desafortunadamente, es O (n^2). –

+2

Cierto. Pero es casi 8 veces más rápido que OrderedDict.fromkeys en una cadena de cinco caracteres. ;-) DSM

+0

Usted gana este. – Marcin

0

Como fue mencionado "" .join (set (foo)) y collections.OrderedDic t lo hará Se agregó foo = foo.lower() en caso de que la cadena tenga caracteres en mayúscula y minúscula y deba eliminar TODOS los duplicados, sin importar si son caracteres superiores o inferiores.

from collections import OrderedDict 
foo = "EugeneEhGhsnaWW" 
foo = foo.lower() 
print "".join(OrderedDict.fromkeys(foo)) 

impresiones eugnhsaw

Cuestiones relacionadas