У меня есть файл, который содержит буквы. Мне нужно найти положение самых длинных повторяющихся букв. Например, если файл содержит aaassdddffccsdddfgssfrsfspppppppppppddsfs
, мне нужна программа, которая находит позицию ppppppppppp
. Я знаю, что мне нужно использовать функцию .index
, чтобы найти место, однако я застрял в цикле.Найти позицию самой длинной повторяющейся буквы
ответ
Вам понадобится цикл всей строки. Следите за каждым новым письмом, с которым вы сталкиваетесь, а также с его индексом и продолжительностью каждой последовательности. Только хранить максимальную последовательность
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
Использование itertools.groupby
:
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'
Это определенно намного читаемо, чем 'max (((next (g) [0], sum (1 для _ в g)) для _, g в группе (перечисление (mystr), key = itemgetter (1))) , key = itemgetter (1)) [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))))
вы можете использовать max с ключом = itemgetter (2) вместо сокращения – abcabc
Быстрым способом достижения этой цели является использование регулярных выражений, чтобы соответствовать повторяющимся символам с (.)(\1+)
. Затем мы перебираем все эти результаты с использованием понимания генератора и находим max
по длине (key=len
). Наконец, найдя самую большую строку, мы называем 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
- 1. Regex, чтобы соответствовать самой длинной повторяющейся подстроке
- 2. Длина самой длинной повторяющейся строки в длинной строке
- 3. Поиск первого индекса самой длинной повторяющейся последовательности
- 4. Найти длину самой длинной подстроки
- 5. C: ошибка strcmp при поиске самой длинной повторяющейся подстроки
- 6. регулярные epxressions, что совпадает с самой длинной повторяющейся последовательности
- 7. Неверные результаты в самой длинной повторяющейся функции подстроки
- 8. Найти длину самой длинной последовательности в матрице
- 9. Найти длину самой длинной конечной подстроки
- 10. Найти длину самой длинной растущей подпоследовательности
- 11. найти длину самой длинной последовательной серии чисел
- 12. Как найти длину самой длинной отсортированной подпоследовательности
- 13. Как найти имя самой длинной хранимой процедуры?
- 14. найти начальное положение самой длинной последовательности 1-х
- 15. Поиск самой большой повторяющейся подстроки
- 16. Индекс возврата самой длинной подстроки
- 17. Поиск самой длинной ошибки слова?
- 18. Печать самой буквы
- 19. Найти позицию первой буквы в строке
- 20. Как найти позицию буквы в списке слов
- 21. Соответствует самой длинной ведущей подстроке
- 22. C: поиск самой длинной строки
- 23. Алгоритм поиска самой длинной анаграммы
- 24. Печать самой длинной общей последовательности
- 25. C++ Отслеживание самой длинной полосы
- 26. Поиск самой длинной общей последовательности
- 27. Поиск самой длинной алфавитной подстроки в более длинной строке
- 28. Найти длину самой длинной непрерывной подпоследовательности того же характер
- 29. Найти длину самой длинной строки в столбце dataframe Pandas
- 30. javascript - найти div с самой длинной шириной на веб-странице
Возможный дубликат [Найти самую длинную последовательность 0 в списке целых чисел] (http://stackoverflow.com/questions/40166522/find-longest-sequence-of-0s-in-the-integer-list) (просто преобразуйте строку в список.) – DyZ
Вы должны опубликуйте [mcve], который показывает нам, что вы пробовали, иначе люди подумают, что вы хотите, чтобы мы сделали домашнее задание для вас. ;) –
Совершенный дубликат этого. Возможно, это домашнее задание. http://stackoverflow.com/questions/2664150/counting-longest-occurence-of-repeated-sequence-in-python –