¿Lista de todos los caracteres únicos en una cadena?

Quiero agregar caracteres a una cadena, pero quiero asegurarme de que todas las letras en la lista final sean únicas .

Ejemplo: "aaabcabccd""abcd"

Ahora, por supuesto, tengo dos soluciones en mi mente. Uno está usando una list que asignará los caracteres con sus códigos ASCII. Entonces, cuando encuentro una letra, el índice se establece en True . Luego escanearé la lista y agregaré todas las que se configuraron. Tendrá una complejidad de tiempo de O (n) .

Otra solución sería usar un dict y seguir el mismo procedimiento. Después de asignar cada carácter, haré la operación para cada clave en el diccionario. Esto también tendrá un tiempo de ejecución lineal .

Como soy un novato de Python, me preguntaba cuál sería el espacio más eficiente. ¿Cuál se podría implementar de manera más eficiente?

PS : El orden no es importante al crear la lista.

La solución más simple es probablemente:

 In [10]: ''.join(set('aaabcabccd')) Out[10]: 'acbd' 

Tenga en cuenta que esto no garantiza el orden en que aparecen las letras en la salida, aunque el ejemplo podría sugerir lo contrario.

Usted se refiere a la salida como una “lista”. Si lo que realmente quieres es una lista, reemplaza ''.join con list :

 In [1]: list(set('aaabcabccd')) Out[1]: ['a', 'c', 'b', 'd'] 

En lo que respecta al rendimiento, preocuparse por ello en esta etapa suena como una optimización prematura.

Utilice un OrderedDict . Esto asegurará que el orden se mantenga

 >>> ''.join(OrderedDict.fromkeys( "aaabcabccd").keys()) 'abcd' 

PD: Acabo de progtwigr la solución OrderedDict y Set, y más tarde es más rápido. Si el orden no importa, el conjunto debe ser la solución natural, si el orden importa; así es como debe hacerlo.

 >>> from timeit import Timer >>> t1 = Timer(stmt=stmt1, setup="from __main__ import data, OrderedDict") >>> t2 = Timer(stmt=stmt2, setup="from __main__ import data") >>> t1.timeit(number=1000) 1.2893918431815337 >>> t2.timeit(number=1000) 0.0632140599081196 

Para completar, aquí hay otra receta que clasifica las letras como un subproducto de la forma en que funciona:

 >>> from itertools import groupby >>> ''.join(k for k, g in groupby(sorted("aaabcabccd"))) 'abcd' 

Si no es necesario que el resultado conserve la orden, simplemente puede utilizar un conjunto

 >>> ''.join(set( "aaabcabccd")) 'acbd' >>> 

Tengo una idea. ¿Por qué no usar la constante ascii_lowercase ?

Por ejemplo, ejecutando el siguiente código:

 # string module, contains constant ascii_lowercase which is all the lowercase # letters of the English alphabet import string # Example value of s, a string s = 'aaabcabccd' # Result variable to store the resulting string result = '' # Goes through each letter in the alphabet and checks how many times it appears. # If a letter appears at least oce, then it is added to the result variable for letter in string.ascii_letters: if s.count(letter) >= 1: result+=letter # Optional three lines to convert result variable to a list for sorting # and then back to a string result = list(result) result.sort() result = ''.join(result) print(result) 

Imprimiré 'abcd'

Hay que ir, todos los duplicados eliminados y ordenados opcionalmente