Список всех уникальных символов в строке?

Я хочу добавить символы в строку, но хочу убедиться, что все буквы в конечном списке уникальны .

Пример: "aaabcabccd""abcd"

Теперь, конечно, у меня есть два решения. Один использует list , который отображает символы с их кодами ASCII. Поэтому всякий раз, когда я сталкиваюсь с письмом, он устанавливает индекс в значение True . Впоследствии я сканирую список и добавлю все те, которые были установлены. Он будет иметь временную сложность O (n) .

Другим решением будет использование dict и выполнение той же процедуры. После сопоставления каждого символа я сделаю операцию для каждого ключа в словаре. Это также будет иметь линейное время работы.

Поскольку я новичок в Python, мне было интересно, что будет более эффективным с точки зрения пространства. Какой из них можно реализовать более эффективно?

PS : Заказ не важен при создании списка.

4 Solutions collect form web for “Список всех уникальных символов в строке?”

Простейшим решением является, вероятно:

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

Обратите внимание, что это не гарантирует порядок, в котором буквы появляются на выходе, даже если в этом примере может быть указано иное.

Вы называете выход «списком». Если список – это то, что вы действительно хотите, замените ''.join со list :

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

Что касается производительности, то беспокоиться об этом на этом этапе звучит как преждевременная оптимизация.

Используйте OrderedDict . Это обеспечит сохранение заказа

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

PS: Я просто приурочил решение OrderedDict и Set, а позже – быстрее. Если заказ не имеет значения, набор должен быть естественным решением, если Order Matter; s вот как вы должны это делать.

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

Для полноты, вот еще один рецепт, который сортирует буквы как побочный продукт того, как он работает:

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

если результат не требует сохранения порядка, то вы можете просто использовать набор

 >>> ''.join(set( "aaabcabccd")) 'acbd' >>> 
  • Производительность утилиты Redis vs Disk в кешировании
  • Обновление словаря python при добавлении к существующим ключам?
  • Почему быстрее, чем list ()?
  • Python. В каком слове могут быть удалены самые последовательные буквы и по-прежнему быть словарем?
  • Производительность между «от импорта пакета» и «пакетом импорта»
  • Почему связь через разделяемую память происходит намного медленнее, чем через очереди?
  • Почему Python «сортируется ()« медленнее, чем », то .sort ()»
  • Найдите две пары пар, которые суммируются с одинаковым значением
  • Векторизованная перемаркировка массива NumPy для последовательных чисел и возврат назад
  • multiprocessing.Pool () медленнее, чем просто использование обычных функций
  • тестирование многопроцессорности python: низкая скорость из-за накладных расходов?
  • Python - лучший язык программирования в мире.