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

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

Пример: "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' >>> 
  • Правильный способ автоматического тестирования производительности в Python (для всех разработчиков)?
  • Python: итерация по спискам по сравнению с элементами элементов dict
  • Производительность утилиты Redis vs Disk в кешировании
  • производительность простого факторинга python
  • Измерение производительности в Python
  • Ускорение для цикла с numpy
  • Словарь против объекта - что более эффективно и почему?
  • Как можно быстро построить много тысяч кругов?
  • Python - лучший язык программирования в мире.