2017-02-06 14 views
2

文字を含むファイルがあります。私は最も長い繰り返し文字の位置を見つける必要があります。たとえば、ファイルにaaassdddffccsdddfgssfrsfspppppppppppddsfsが含まれている場合、私はpppppppppppの位置を見つけるプログラムが必要です。私は.index関数を使用して場所を見つける必要があることを知っていますが、ループにはまっています。最も長い繰り返し文字の位置を見つける

+0

可能な重複[最長のシーケンスを探します0の整数リスト](http://stackoverflow.com/questions/40166522/find-longest-sequence-of-0s-in-the-integer-list)(文字列をリストに変換するだけです) – DyZ

+3

あなたが試したことを私たちに示す[mcve]を投稿してください。さもなければ、人々はあなたが私たちがあなたの宿題をやりたいと思うでしょう。 ;) –

+0

これを完全に複製しました。おそらく宿題です。 http://stackoverflow.com/questions/2664150/counting-longest-occurence-of-repeated-sequence-in-python –

答えて

1

文字列全体をループする必要があります。あなたが出会う新しい手紙と、それがインデックスであることと、各シーケンスがどれくらいの間続くかを記録しておきます。 itertools.groupbyを使用して最大シーケンス

s = 'aaassdddffccsdddfgssfrsfspppppppppppddsfs' 

max_c = max_i = max_len = None 
cur_c = cur_i = cur_len = None 
for i, c in enumerate(s): 
    if c != cur_c: 
     if max_len is None or cur_len > max_len: 
      max_c, max_i, max_len = cur_c, cur_i, cur_len 
     cur_c = c 
     cur_i = i 
     cur_len = 1 
    else: 
     cur_len += 1 
else: 
    # One last check when the loop completes 
    if max_len is None or cur_len > max_len: 
     max_c, max_i, max_len = cur_c, cur_i, cur_len 

print max_c, max_i, max_len 
3

をのみを格納します。

import itertools 

mystr = 'aaassdddffccsdddfgssfrsfspppppppppppddsfs' 

idx = 0 
maxidx, maxlen = 0, 0 
for _, group in itertools.groupby(mystr): 
    grouplen = sum(1 for _ in group) 
    if grouplen > maxlen: 
     maxidx, maxlen = idx, grouplen 
    idx += grouplen 

は、IDXと最長の同一の部分文字列の長さを与える:ここで

>>> print(maxidx, maxlen) 
25, 11 

>>> mystr[25:25+11] 
'ppppppppppp' 
+1

groupby(enumerate(mystr)、key = itemgetter(1))の_、gの 'max((next(g)[0]、sum 、key = itemgetter(1))[0] ';) –

0

はoneliner

from itertools import groupby 
from functools import reduce 
[(k, next(g)[0], sum(1 for _ in g)+1) for k, g in groupby(enumerate(
    'aaassdddffccsdddfgssfrsfspppppppppppddsfs'), key=itemgetter(1))] 
です

上記(キー、位置、長さ)が生成されます。あなたは

from itertools import groupby 
from functools import reduce 
from operator import itemgetter 
reduce(lambda x,y:x if x[2] >= y[2] else y, 
    ((k, next(g)[0], sum(1 for _ in g)+1) for k, g in groupby(enumerate(
    'aaassdddffccsdddfgssfrsfspppppppppppddsfs'), key=itemgetter(1)))) 
+0

あなたはreduceの代わりにkey = itemgetter(2)でmaxを使うことができます – abcabc

0

これを達成する簡単な方法は、(.)(\1+)と文字の繰り返しにマッチする正規表現を使用することですが軽減適用 で最大の長さを得ることができます。次に、生成者の理解度を使用してこれらの結果をすべてループし、長さ(key=len)に従ってmaxを見つけます。最後に、最大の文字列を発見した、我々は最長繰り返し手紙が発生した場所を見つけるためにthestr.index()を呼び出します。ここでは

import re 
txt = "aaassdddffccsdddfgssfrsfspppppppppppddsfs" 
idx = txt.index(max((''.join(f) for f in re.findall(r"(.)(\1+)", txt)), key=len)) 
print(idx) 

がステージに出て壊れ同じコードです:の

>>> import re 
>>> txt = "aaassdddffccsdddfgssfrsfspppppppppppddsfs" 
>>> matches = list(''.join(f) for f in re.findall(r"(.)(\1+)", txt)) 
>>> print(matches) 
['aaa', 'ss', 'ddd', 'ff', 'cc', 'ddd', 'ss', 'ppppppppppp', 'dd'] 
>>> longest = max(matches, key=len) 
>>> print(longest) 
ppppppppppp 
>>> print(txt.index(longest)) 
25 
関連する問題