Поскольку люди бегут, чтобы ответить, этот использует генератор для генерации диапазонов:
def find_ranges(fn):
with open(fn) as f:
start = None
for line_no, line in enumerate(f):
if start is None:
if '*' in line:
start = line_no + 1 # start of a range
elif '*' not in line:
yield [start, line_no] # seen end of range
start = None
if start is not None: # end of file without seeing end of a range
yield [start, line_no + 1]
ranges = [range for range in find_ranges('test.txt')]
max_range = max(ranges, key = lambda x: x[1] - x[0]) # largest range seen
print(ranges, max_range[1] - max_range[0] + 1)
Отпечатки:
[[1, 4], [21, 33]] 13
Конечно, вы можете отформатировать диапазоны так, как вам wi sh.
Тот же алгоритм без использования генератора:
def find_ranges(fn):
ranges = []
with open(fn) as f:
start = None
for line_no, line in enumerate(f):
if start is None:
if '*' in line:
start = line_no + 1 # start of a range
elif '*' not in line:
ranges.append([start, line_no]) # end of a range
start = None
if start is not None: # end of file without seeing end of a range
ranges.append([start, line_no + 1])
max_range = max(ranges, key = lambda x: x[1] - x[0])
return ranges, max_range[1] - max_range[0] + 1
ranges, max_range = find_ranges('test.txt')
print(ranges, max_range)