2017-06-09 34 views
1

短縮:私は、文字列持つ文字列

a = babababbaaaaababbbab 

をそして、それは次のようになりますので、それを短くする必要があります

(ba)3(b)2(a)5ba(b)3ab 

だから、基本的にはすべての繰り返し文字を取り、どのように多くの書き込みをする必要がありますがそれらを印刷するのではなく、繰り返しています。

from itertools import groupby 
a = 'babababbaaaaababbbab' 
grouped = ["".join(grp) for patt,grp in groupby(a)] 
solved = [str(len(i)) + i[0] for i in grouped if len(i) >= 2] 

が、これは唯一の繰り返しされている文字ではなく、パターンのためにこれを行います。 私はこれの半分を行うことができました。私は文字列で 'ab'パターンを見つけることでこれを行うことができますが、これは可能なすべての文字列に対して実行可能である必要があります。誰かが似たようなことに遭遇しましたか?

+2

これは関連するかもしれません:https://stackoverflow.com/questions/11090289/find-longest-repetitive-sequence-in-a-string –

+12

これはあいまいです。 'aaabbbaaabbb'の期待される出力は?それは '(a)3(b)3(a)3(b)3'か'(aaabbb)2 'ですか? –

+0

@SvenMarnachそれはa(3)b(3)です。 – Nenad

答えて

9

あなたは簡単にregexでこれを行うことができます:ここで説明するの

>>> repl= lambda match:'({}){}'.format(match.group(1), len(match.group())//len(match.group(1))) 
>>> re.sub(r'(.+?)\1+', repl, 'babababbaaaaababbbab') 
'(ba)3(b)2(a)5ba(b)3ab' 

あまり。パターン(.+?)\1+は繰り返し文字シーケンスと一致し、ラムダ関数はそれらを(sequence)numberの形式に書き換えます。

+0

恐ろしい!私は正規表現を習得する良い時間を惜しまないかもしれないと思う。本当に良い答え。 –

+0

'aabaabaab'の場合、これは'(aab)3'の代わりにかなり直感的な '(a)2(baa)2b'を与えます。それは間違っていると言っているわけではありませんが、問題は少し不十分です。 – Dukeling

+0

@Dukelingこれは、aaabbbaaabbbが(a)3(b)3(a)3(b)3になるというOPの発言に一致するように、可能な限り最短のシーケンスを繰り返します。もしそれが望ましくなければ '(。+?)\ 1 +'を '(。+)\ 1 +'に変更することもできます。 )2。 –

-2

私は正確に何を探しているのかは分かりませんが、ここで役立ちます。

A=a.count('a') 
B=a.count('b') 
AB=a.count('ab') 
BAB=a.count('bab') 
BA=a.count('ba') 
print(A,'(a)',B,'(b)',AB,'(ab)',BAB,'(bab)',BA,'(ba)') 
+0

これは問題の正しい例を出力するようには見えませんが、より一般的な問題は気にしないでください。 – Dukeling

0

これは私が思い付いた、コードが混乱ですが、私はちょうど迅速な楽しみを持っていると思ったので、私はそれがこの

a = 'babababbaaaaababbbab' 

def compress(text): 
    for i in range(1, len(text) // 2): 
     for j, c in enumerate(text[:-i if i > 0 else len(text)]): 
      pattern = text[j:i+j] 
      new_text = pattern_repeats_processor(pattern, text, j) 
      if new_text != text: 
       return compress(new_text) 
    return text 

def pattern_repeats_processor(pattern, text, i): 
    chunk = pattern 
    count = 1 
    while chunk == pattern and i + (count + 1) * len(pattern) < len(text): 
     chunk = text[i + count * len(pattern): i + (count + 1) * len(pattern)] 
     if chunk == pattern: 
      count = count + 1 
     else: 
      break 
    if count > 1: 
     return text[:i] + '(' + pattern + ')' + str(count) + text[i + (count + 0) * len(pattern):] 
    return text 

print(compress(a)) 
print(a) 

ようになりましょうそれは= babababbaaaaababbbabを作ります> (ba)3(b)2(a)5ba(b)3ab

PSもちろん、ローイングの答えはマイルで、かなり印象的です。

関連する問題