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

Решение 1:

def func(s):
    st = ''
    for i in range(0,len(s)):
        if s[i] == s[i-1]:
            pass
        else:
            st += s[i]
    return st

s = 'xxxxxyyyyy'

print(func(s)) 
>>> xy

Решение 2:

    from itertools import groupby 
    def func(s): 
        result_str = [] 
        for (key,group) in groupby(s): 
            result_str.append(key) 

    return ''.join(result_str)

s = 'xxxxxyyyyy'

print(func(s))

Какое решение выбрать?
Какие преимущества и недостатки у данных решений по отношению друг к другу?


Ответы (3 шт):

Автор решения: вася

Второе, потому что многократное добавление в конец строки в питоне работает медленно из-за необходимости перекопирования.

А вообще лучше использовать готовые функции типа unique_justseen() из more_itertools.

→ Ссылка
Автор решения: MaxU

Практика - критерий истины! (с) Маркс

def func1(s):
    st = []
    for i in range(0,len(s)):
        if s[i] != s[i-1]:
            st.append(s[i]) 
    return "".join(st)
    
def func2(s): 
    result_str = [] 
    for (key,group) in groupby(s): 
        result_str.append(key) 
    return ''.join(result_str)
    
def func3(s):
    return re.sub(r"(.)\1+", r"\1", s)

def func4(s):
    return "".join(unique_justseen(s))

замеры времени:

In [22]: s = "".join(str(i) for i in range(10**5))

In [23]: len(s)
Out[23]: 488890

In [24]: %timeit func1(s)
135 ms ± 117 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [25]: %timeit func2(s)
99.7 ms ± 311 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [26]: %timeit func3(s)
92.6 ms ± 1.37 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [36]: %timeit func4(s)
107 ms ± 487 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

UPD: для более длинной строки (5.888.890 символов):

In [38]: s = "".join(str(i) for i in range(10**6))

In [42]: len(s)
Out[42]: 5888890

In [39]: %timeit func1(s)
1.67 s ± 25.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [40]: %timeit func2(s)
1.25 s ± 4.49 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [41]: %timeit func3(s)
1.18 s ± 2.32 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [43]: %timeit func4(s)
1.35 s ± 13.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
→ Ссылка
Автор решения: user525906
s  = "anoootoooonnnn"
k = set(s)
for i in k:
    while i+i in s:
        if (i+i) in s:
            s = s.replace(i+i,i)
print(s)
→ Ссылка