Как получить число, которое повторяется n раз?

#python #file #iteration #processing-efficiency

#python #файл #итерация #эффективность обработки

Вопрос:

У меня есть файл с большим количеством чисел:

 0.98
0.23
0.10
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
10.3
11.9
0.56
...
  

Я хочу напечатать номер строки, в которой число 0 повторяется 10 раз подряд (как минимум). Учитывая вышеуказанный ввод, на выходе будет: 4 (для строки с номером 4 и потому, что 0 повторяется 10 раз подряд). Файлы list.txt это огромный файл. Я новичок в Python. Как я могу удалить ошибку в следующем скрипте:

 import ast
values = open("list.txt","r")
values = list(map(int, ast.literal_eval(values.read().strip())))
count=0
length=""
if len(values)>1:
    for i in range(1,len(values)):
       if values[i-1]==values[i]:
          count =1
       else :
           length  = values[i-1] " repeats " str(count) ", "
           count=1
    length  = ("and " values[i] " repeats " str(count))
else:
    i=0
    length  = ("and " values[i] " repeats " str(count))
print (length)
  

Комментарии:

1. «Файлы list.txt это огромный файл» — тогда сделайте это построчно. Также вас интересует первое вхождение (строка под номером 4 в данном случае) или все вхождения шаблона?

2. Я хочу прочитать файл построчно и остановиться, когда он обнаружит, что число 0 повторяется 10 раз подряд, и это все, независимо от всех совпадений шаблона.

Ответ №1:

Прочитайте и оцените файл построчно. Если шаблон найден, цикл прерывается, прекращая чтение файла

 import ast
count = 0
lineNb = -1
found = False # False by default
with open("list.txt") as f:
    for i,line in enumerate(f): # loop over lines, one-by-one
        value = ast.literal_eval(line)
        if value == 0:
            if count == 0: # first occurrence
                lineNb = i # set potential lineNb
            count  = 1     # increment counter
            if count == 10: # desired condition
                found = True # now we know we have found the pattern
                break        # break the for loop
        else: # not 0
            count = 0 # reset counter

print(found,lineNb) # (True,3) # lineNb is zero-based, 3 = 4th line
  

Ответ №2:

 with open('consecutive.txt') as f:
    c = 0
    for i,line in enumerate(f):
        if float(line)==0.0:
            c =1
            if c == 10:
                print(i-8)
                break
        else:
            c=0
  

Вывод

 4