Python: Най-добрият начин за премахване на дублиран знак от низ

Как мога да премахна дублирани знаци от низ с помощта на Python? Например, да кажем, че имам низ:

foo = "SSYYNNOOPPSSIISS"

Как мога да направя низа:

foo = SYNOPSIS

Нов съм в Python и Какво съм уморен и работи. Знаех, че има интелигентен и най-добър начин да направя това.. и само опитът може да покаже това..

def RemoveDupliChar(Word):
        NewWord = " "
        index = 0
        for char in Word:
                if char != NewWord[index]:
                        NewWord += char
                        index += 1
        print(NewWord.strip()) 

ЗАБЕЛЕЖКА: Редът е важен и този въпрос не е подобен на този един.


person Rahul Patil    schedule 14.09.2013    source източник


Отговори (6)


Използвайки itertools.groupby:

>>> foo = "SSYYNNOOPPSSIISS"
>>> import itertools
>>> ''.join(ch for ch, _ in itertools.groupby(foo))
'SYNOPSIS'
person falsetru    schedule 14.09.2013
comment
Възможно ли е да промените grp на _? - person Roman Pekar; 14.09.2013
comment
@RahulPatil, _ (grp преди модификацията на отговора) е итерируем, което дава отделни елементи (знаци тук), които са групирани заедно. - person falsetru; 14.09.2013
comment
Прекарах известно време, за да създам тази функция, но не знам itertools.groupby как го намерихте? - person Rahul Patil; 14.09.2013
comment
@RahulPatil Използва ли се често в цикли като име на заместител. Никога не го използвате, но е поставен там, защото трябва да поставите нещо. itertools.groupby е част от модула itertools в стандартната библиотека. Има връзка в отговора на falsetru - person TerryA; 14.09.2013
comment
@RahulPatil, виждам Индекс на модули на Python, за да намеря полезни модули в стандартната библиотека. - person falsetru; 14.09.2013
comment
благодаря на всички, наистина голямо предимство тук след публикуване на малък код - person Rahul Patil; 14.09.2013
comment
Това работи както е показано, ако искате резултатът да бъде „СИНОПСИС“. Но какво, ако искате резултатът да бъде „SYNOPI“, където нито един знак не се повтаря повече от веднъж. И какво, ако искате, нека кажем „джил“ от „джилл“, тъй като „джил“ е правилният правопис. - person rabin utam; 30.05.2014
comment
@rabinutam, Използване на collections.OrderedDict: from collections import OrderedDict; print(''.join(OrderedDict.fromkeys("SSYYNNOOPPSSIISS"))) - person falsetru; 30.05.2014
comment
@falsetru здравей, как да го използвам в колона панди? - person sygneto; 24.06.2019
comment
@sygneto, моля, публикувайте отделен въпрос. - person falsetru; 24.06.2019
comment
@falsetru stackoverflow.com/questions/56736595/ - person sygneto; 24.06.2019

Това е решение без импортиране на itertools:

foo = "SSYYNNOOPPSSIISS"
''.join([foo[i] for i in range(len(foo)-1) if foo[i+1]!= foo[i]]+[foo[-1]])

Out[1]: 'SYNOPSIS'

Но е по-бавен от другите методи!

person G M    schedule 14.09.2013

Какво ще кажете за това:

oldstring = 'SSSYYYNNNOOOOOPPPSSSIIISSS'
newstring = oldstring[0]
for char in oldstring[1:]:
    if char != newstring[-1]:
        newstring += char    
person Elliott    schedule 03.04.2015

def remove_duplicates(astring):
  if isinstance(astring,str) :
    #the first approach will be to use set so we will convert string to set and then convert back set to string and compare the lenght of the 2
    newstring = astring[0]
    for char in astring[1:]:
        if char not in newstring:
            newstring += char    
    return newstring,len(astring)-len(newstring)
  else:
raise TypeError("only deal with alpha  strings")

Открих това решение с itertools и с разбиране на списък дори решението, когато сравняваме char с последния елемент от списъка, не работи

person Espoir Murhabazi    schedule 15.07.2017

Какво ще кажеш

foo = "SSYYNNOOPPSSIISS"


def rm_dup(input_str):
    newstring = foo[0]
    for i in xrange(len(input_str)):
        if newstring[(len(newstring) - 1 )] != input_str[i]:
            newstring += input_str[i]
        else:
            pass
    return newstring

print rm_dup(foo)
person rrao    schedule 15.11.2016

Можете да опитате това:

string1 = "example1122334455"
string2 = "hello there"

def duplicate(string):
    temp = ''

    for i in string:
        if i not in temp: 
            temp += i

    return temp;

print(duplicate(string1))
print(duplicate(string2))
person mohit Kumar    schedule 20.10.2019