2017-08-24 2 views
1

Python 3を使用して、大きなバイナリセット内で最も長い連続した数字セットの開始点と終了点を見つけようとしています。現時点では、1と0の連続した最長の数を見つけました。今では、各番号の開始点と終了点がどこにあるかを見つける必要があります。これまでのところ、私のコードは次のとおりです。1のためにPythonで大規模なバイナリセット内の最も長い連続した数字セットの開始点と終了点を見つける

def getMaxSegmentLength(readable): 
    current_length = 0 
    max_length = 0 


    for x in readable: 
     if x == '1': 
      current_length += 1 
     else: 
      max_length = max(max_length, current_length) 
      current_length = 0 

     return max(max_length, current_length) 


def main(): 
    with open('C:/01.txt', 'r') as inputf: 
     s = inputf.read() 
     n = getMaxSegmentLength(s) 
    print("The longest streak of 1's = " + str(n)) 


if __name__ == '__main__': 
    main() 

0の場合:

def getMaxSegmentLength(readable): 
    current_length = 0 
    max_length = 0 


    for x in readable: 
     if x == '0': 
      current_length += 1 
     else: 
      max_length = max(max_length, current_length) 
      current_length = 0 

     return max(max_length, current_length) 


def main(): 
    with open('C:/01.txt', 'r') as inputf: 
     s = inputf.read() 
     m = getMaxSegmentLength(s) 
    print("The longest streak of 0's = " + str(m)) 


if __name__ == '__main__': 
    main() 

このコードは、中に含まれている非常に大きなバイナリセットに数字の最長の連続したセットを見つけました別のファイル。私はまた、0と1の数がどれくらいあるかを知っています。私は開始点と終了点を見つける次のステップを開始していません。

+1

私はあなたが[列挙]を必要だと思います(https://docs.python.org/2.3/whatsnew/section-enumerate.html)。 –

答えて

0

シンプルで、1のスジがどこで始まるか、そして最大スジの開始点を維持するための変数(max_streak)を追跡します。大きなストリークが見つかるたびにupdate max_streak。

def getMaxSegmentLength(readable, digit): 
'''find the longest streak of digit in the readable string''' 
    current_length = 0 
    max_length = 0 

    starts_at= -1 
    max_starts_at= -1 

    for i, x in enumerate(readable): 
     if x == digit: 
      current_length += 1 
      if current_length == 1: 
       starts_at = i 

     elif max_length < current_length: 
      max_length = current_length 
      max_starts_at = starts_at 
      current_length = 0 

    if max_length < current_length: 
     max_length = current_length 
     max_starts_at = starts_at 

    max_ends_at = max_starts_at+max_length-1 

    # return a tuple of start point and end point index 
    return max_starts_at, max_ends_at 


def main(): 
    with open('F:/input.txt', 'r') as inputf: 
     s = inputf.read() 

     # check for 1's 
     n = getMaxSegmentLength(s, '1') 
     print("The longest streak of 1's = " + str(n)) 

     # check for 0's 
     n = getMaxSegmentLength(s, '0') 
     print("The longest streak of 0's = " + str(n)) 

if __name__ == '__main__': 
    main() 
0

あなたは、各シーケンスにマッチする正規表現を使用して、該当する桁の辞書を更新することができます:

import re 

# example input string 
input = "00111101100010100010101111011011011" 

best = { 
    "0": { "start": 0, "len": 0 }, 
    "1": { "start": 0, "len": 0 } 
}; 
for m in re.compile(r"(.)\1*").finditer(input): 
    if best[m.group()[0]]["len"] < len(m.group()): 
     best[m.group()[0]] = { "start": m.start(), "len": len(m.group()) } 

print (best) 

出力:

{'1': {'start': 2, 'len': 4}, '0': {'start': 9, 'len': 3}} 
関連する問題