Удалить дубликаты букв подряд - PullRequest
5 голосов
/ 18 июля 2011

В поисках быстрого способа ограничить количество дубликатов до 2, когда они появляются рядом друг с другом.

Например: jeeeeeeeep => ['jep','jeep']

Ищет предложения в python, но рад видеть пример во всем - не сложно переключиться.

Спасибо за любую помощь!

РЕДАКТИРОВАТЬ: Английский не имеет (или много) согласных (той же буквы) подряд, верно?Давайте ограничим это, чтобы не было повторяющихся согласных в строке и до двух гласных в строке

РЕДАКТИРОВАТЬ2: Я глуп (эй, у этого слова два согласных), просто проверяю все буквы, ограничиваю повторяющиеся буквыкоторые рядом друг с другом до двух.

Ответы [ 5 ]

3 голосов
/ 18 июля 2011

Вот рекурсивное решение с использованием groupby.Я оставил вам на усмотрение, какие символы вы хотите иметь возможность повторять (по умолчанию только гласные):

from itertools import groupby

def find_dub_strs(mystring):
    grp = groupby(mystring)
    seq = [(k, len(list(g)) >= 2) for k, g in grp]
    allowed = ('aeioupt')
    return rec_dubz('', seq, allowed=allowed)

def rec_dubz(prev, seq, allowed='aeiou'):
    if not seq:
        return [prev]
    solutions = rec_dubz(prev + seq[0][0], seq[1:], allowed=allowed)
    if seq[0][0] in allowed and seq[0][1]:
        solutions += rec_dubz(prev + seq[0][0] * 2, seq[1:], allowed=allowed)
    return solutions

Это действительно просто эвристически сокращенный поиск в глубину в вашем "пространстве решений".«из возможных слов.Эвристика заключается в том, что мы допускаем только одно повторение за раз, и только если это допустимая повторяемая буква.В конце вы должны получить 2 ** n слов, где n - это число раз, когда «разрешенный» символ был повторен в вашей строке.

>>> find_dub_strs('jeeeeeep')
['jep', 'jeep']
>>> find_dub_strs('jeeeeeeppp')
['jep', 'jepp', 'jeep', 'jeepp']
>>> find_dub_strs('jeeeeeeppphhhht')
['jepht', 'jeppht', 'jeepht', 'jeeppht']
1 голос
/ 18 июля 2011

Решение для одного символа с использованием groupby:

>>> from itertools import groupby
>>> s = 'jeeeeeeeep'
>>> ''.join(c for c, unused in groupby(s))
'jep'

И максимум для двух символов:

''.join(''.join(list(group)[:2]) for unused, group in groupby(s))
1 голос
/ 18 июля 2011

используйте регулярное выражение:

>>> import re
>>> re.sub(r'(.)\1\1+', r'\1\1', 'jeeeep')
'jeep'
0 голосов
/ 18 июля 2011

Вот решение Sh + Perl, боюсь, я не знаю Python:

echo jjjjeeeeeeeeppppp | perl -ne 's/(.)\1+/\1\1/g; print $_;'

Ключ - это регулярное выражение, которое находит (.)\1+ и заменяет его на \1\1, глобально.

0 голосов
/ 18 июля 2011

Используйте регулярные выражения вместе с событием нажатия клавиши!

...