Как выполнить удаление дубликатов из строки в Python на месте? - PullRequest
0 голосов
/ 03 марта 2019

Я пытаюсь реализовать алгоритм на месте для удаления дубликатов из строки в Python.

str1 = "geeksforgeeks"
for i in range(len(str1)):
    for j in range(i+1,len(str1)-1):
         if str1[i] == str1[j]:  //Error Line
                      str1 = str1[0:j]+""+str1[j+1:]



print str1

В приведенном выше коде я пытаюсь заменить дублирующий символ пробелом.Но я получаю IndexError: string index out of range на if str1[i] == str1[j].Я что-то упускаю или это не правильный путь?

Мой ожидаемый результат: geksfor

Ответы [ 4 ]

0 голосов
/ 03 марта 2019

Вот упрощенная версия unique_everseen из itertools recipes.

from itertools import filterfalse

def unique_everseen(iterable)
    seen = set()
    see _ add = seen.add
    for element in filterfalse(seen.__contains__, iterable):
        seen_add(element)
        yield element

Затем вы можете использовать этот генератор с str.join для получения ожидаемого выхода.

str1 = "geeksforgeeks"
new_str1 = ''.join(unique_everseen(str1)) # 'geksfor'
0 голосов
/ 03 марта 2019

Вы можете сделать все это только с помощью набора и понимания.Не нужно усложнять вещи.

str1 = "geeksforgeeks"

seen = set()
seen_add = seen.add
print(''.join(s for s in str1 if not (s in seen or seen_add(s))))
#geksfor

«Простое лучше, чем сложное».

~ См. PEP20

Редактировать

Хотя вышеизложенное проще, чем ваш ответ, это самый эффективный способ удаления дубликатов из коллекции , но более простым решением будет использование:

from collections import OrderedDict
print("".join(OrderedDict.fromkeys(str1)))
0 голосов
/ 03 марта 2019

Как уже указывалось, str является неизменным, поэтому требование на месте не имеет смысла.Если вы хотите получить желаемый результат, я бы сделал это следующим образом:

str1 = 'geeksforgeeks'
out = ''.join([i for inx,i in enumerate(str1) if str1.index(i)==inx])
print(out) #prints: geksfor

Здесь я использовал функцию enumerate для получения нумерованных (inx) букв и факта, что .index метод str, возвращает наименьший возможный индекс элемента, поэтому str1.index('e') для данной строки равно 1, а не 2, не 9 и не 10.

0 голосов
/ 03 марта 2019

Невозможно изменить строки на месте в Python, так же, как невозможно изменить числа на месте в Python.

a = "something"
b = 3

b += 1        # allocates a new integer, 4, and assigns it to b
a += " else"  # allocates a new string, " else", concatenates it to `a` to produce "something else"
              # then assigns it to a
...