Удалить N последовательных повторяющихся символов в строке - PullRequest
1 голос
/ 03 мая 2019

Я пытаюсь решить проблему, когда пользователь вводит строку, скажем, str = "aaabbcc" и целое число n = 2.

Таким образом, функция должна удалять символы, которые появляются 'n' раз изstr и вывод только "aaa".

Я попробовал несколько подходов, и я не смог получить правильный вывод.Существуют ли какие-либо функции регулярных выражений, которые я мог бы использовать, или какие-либо рекурсивные функции или просто старые итерации.

Заранее спасибо.

Ответы [ 5 ]

3 голосов
/ 03 мая 2019

Использование itertools.groupby

Ex:

from itertools import groupby    
s = "aaabbcc"
n = 2

result = ""
for k, v in groupby(s):
    value = list(v)
    if not len(value) == n:
        result += "".join(value)
print(result)

Выход:

aaa
2 голосов
/ 03 мая 2019
from collections import Counter

counts = Counter(string)
string = "".join(c for c in string if counts[c] != 2)

Редактировать: Подожди, извини, я пропустил "подряд". Это удалит символы, которые встречаются ровно два раза во всей строке (соответствует вашему примеру, но не общему случаю).

Последовательный фильтр немного более сложен, но выполним - просто сначала найдите последовательные прогоны, а затем отфильтруйте те, которые имеют длину два.

runs = [[string[0], 0]]
for c in string:
    if c == runs[-1][0]:
        runs[-1][1] += 1
    else:
        runs.append([c, 1])
string = "".join(c*length for c,length in runs if length != 2)

Edit2: Как правильно указывают другие ответы, первая часть этого сделана изначально groupby

from itertools import groupby

string = "".join(c*length for c,length in groupby(string) if length != 2)
2 голосов
/ 03 мая 2019

Вы можете использовать itertools.groupby:

>>> s = "aaabbccddddddddddeeeee"
>>> from itertools import groupby
>>> n = 3
>>> groups = (list(values) for _, values in groupby(s))
>>> "".join("".join(v) for v in groups if len(v) < n)
'bbcc'
1 голос
/ 03 мая 2019
from collections import defaultdict
def fun(string,n):
    dic = defaultdict(int)
    for i in string:
        dic[i]+=1
    check = []
    for i in dic:
        if dic[i]==n:
            check.append(i)
    for i in check:
        del dic[i]
    return dic
string = "aaabbcc"
n = 2
result = fun(string, n)
sol =''
for i in result:
    sol+=i*result[i]

print(sol)

выход

aaa
1 голос
/ 03 мая 2019
In [15]: some_string = 'aaabbcc'

In [16]: n = 2

In [17]: final_string = ''

In [18]: for k, v in Counter(some_string).items():
    ...:     if v != n:
    ...:         final_string += k * v
    ...:

In [19]: final_string
Out[19]: 'aaa'

Вам понадобится: from collections import Counter

...