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

Как эта функция позволяет удалить повторяющиеся символы из строки в python?

Я искал, как создать функцию, которая удаляет повторяющиеся символы из строки в python и обнаруживает это при переполнении стека:

    from collections import OrderedDict

    def remove_duplicates (foo) :
        print " ".join(OrderedDict.fromkeys(foo))

Это работает, но как? Я искал, что означает OrderedDict и fromkeys, но я не могу найти ничего, что объясняет, как это работает в этом контексте.

4b9b3361

Ответ 1

Я сделаю снимок:

OrderedDict - словари, в которых хранятся ключи, чтобы они были добавлены. Нормальных словарей нет. Если вы посмотрите документ fromkeys, вы найдете:

OD.fromkeys(S [, v]) → Новый упорядоченный словарь с ключами из S.

Таким образом, метод класса fromkeys создает OrderedDict, используя элементы во входном итерабельном S (в моих примерах символов из строки) в качестве ключей. В словаре ключи уникальны, поэтому повторяющиеся элементы в S игнорируются.

Например:

s = "abbcdece" # example string with duplicate characters

print(OrderedDict.fromkeys(s))

В результате получается OrderedDict:

OrderedDict([('a', None), ('b', None), ('c', None), ('d', None), ('e', None)])

Затем " ".join(some_iterable) принимает итерабельность и соединяет ее элементы, используя пробел в этом случае. Он использует только ключи, так как итерация через словарь осуществляется его клавишами. Например:

for k in OrderedDict.fromkeys(s): # k is a key of the OrderedDict
    print(k)

Результаты в:

a
b
c
d
e

Затем вызовите join:

print(" ".join(OrderedDict.fromkeys(s)))

распечатает:

a b c d e

Использование set

Иногда люди используют набор для этого:

print( " ".join(set(s)))
# c a b d e

Но в отличие от наборов в С++, наборы в python не гарантируют порядок. Таким образом, использование набора даст вам уникальные значения легко, но они могут быть в другом порядке, тогда они находятся в исходном списке или строке (как в приведенном выше примере).

Надеюсь, это немного поможет.

Ответ 2

По понятию списка

print ' '.join([character for index, character in enumerate(foo) if character not in foo[:index]])