Список всех уникальных символов в строке?
Я хочу добавить символы в строку, но хочу, чтобы все буквы в конечном списке были уникальными.
Пример: "aaabcabccd"
→ "abcd"
Теперь, конечно, у меня есть два решения. Один использует list
, который будет отображать символы с их кодами ASCII. Поэтому всякий раз, когда я сталкиваюсь с буквой, он устанавливает индекс в True
. Впоследствии я сканирую список и добавлю все те, которые были установлены. Он будет иметь временную сложность O (n).
Другое решение будет использовать dict
и следовать той же процедуре. После отображения каждого char я сделаю операцию для каждого ключа в словаре. Это будет иметь линейное время.
Поскольку я новичок в Python, мне было интересно, какой из них будет более экономичным. Какой из них можно реализовать более эффективно?
PS: при создании списка важно не.
Ответы
Ответ 1
Простейшим решением, вероятно, является:
In [10]: ''.join(set('aaabcabccd'))
Out[10]: 'acbd'
Обратите внимание, что это не гарантирует порядок, в котором буквы появляются на выходе, даже если в этом примере может быть указано иное.
Вы называете выход "списком". Если список действительно нужен, замените ''.join
на list
:
In [1]: list(set('aaabcabccd'))
Out[1]: ['a', 'c', 'b', 'd']
Что касается производительности, то беспокоиться об этом на этом этапе звучит как преждевременная оптимизация.
Ответ 2
Используйте 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
Ответ 3
если результат не требует сохранения порядка, вы можете просто использовать набор
>>> ''.join(set( "aaabcabccd"))
'acbd'
>>>
Ответ 4
Для полноты, здесь другой рецепт, который сортирует буквы как побочный продукт того, как он работает:
>>> from itertools import groupby
>>> ''.join(k for k, g in groupby(sorted("aaabcabccd")))
'abcd'
Ответ 5
У меня есть идея. Почему бы не использовать константу ascii_lowercase
?
Например, выполните следующий код:
# 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)
Будет напечатан 'abcd'
Там вы идете, все дубликаты удалены и, возможно, отсортированы
Ответ 6
Хранить уникальных персонажей в списке
Способ 1:
uniue_char = list(set('aaabcabccd'))
#['a', 'b', 'c', 'd']
Способ 2: по петле (сложный)
uniue_char = []
for c in 'aaabcabccd':
if not c in uniue_char:
uniue_char.append(c)
print(uniue_char)
#['a', 'b', 'c', 'd']
Ответ 7
char_seen = []
for char in string:
if char not in char_seen:
char_seen.append(char)
print(''.join(char_seen))
Это сохранит порядок, в котором идут алфавиты,
вывод будет
abcd