Подтвердить что ты не робот

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

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

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

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

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

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

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

4b9b3361

Ответ 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