Как найти наибольшее количество раз, которое слово повторяется последовательно в данной строке? - PullRequest
0 голосов
/ 26 марта 2020

Хорошо, так что это довольно запутанный вопрос, я постараюсь сформулировать его наилучшим образом.

Я пытаюсь найти способ найти самые большие последовательные повторы слова в строке в Python

Например, скажем, слово, которое я хочу посмотреть for - это «яблоко», а строка: « яблоко банано-оранжереоранжоранбанбан * яблочный апельсиновый яблочный-яблочный ». Здесь наибольшее количество последовательных повторений для слова «яблоко» - 3.

Я пробовал многочисленные способы поиска повторяющегося символа, например:

word="100011010" #word = "1"
count=1
length=""
if len(word)>1:
    for i in range(1,len(word)):
       if word[i-1]==word[i]:
          count+=1
       else :
           length += word[i-1]+" repeats "+str(count)+", "
           count=1
    length += ("and "+word[i]+" repeats "+str(count))
else:
    i=0
    length += ("and "+word[i]+" repeats "+str(count))
print (length)

Но это работает с целыми числами а не слова. Он также выводит количество повторений символа в целом, но не идентифицирует самые большие последовательные повторения. Я надеюсь, что в этом есть смысл. Мой мозг как будто повсюду, так что я прошу прощения, если я триппин

Ответы [ 2 ]

1 голос
/ 26 марта 2020

Вот решение, которое я придумала, и которое, я считаю, решает вашу проблему. Существует почти наверняка более простой / быстрый способ сделать это, если вы потратите больше времени на решение проблемы, которую я бы поощрил.

import re

search_string = "applebananaorangeorangeorangebananaappleappleorangeappleappleappleapple"
search_term = "apple"


def search_for_term(search_string, search_term):
    #split string into array on search_term
    #keeps search term in array unlike normal string split
    split_string = re.split(f'({search_term})', search_string)

    #remove unnecessary characters
    split_string = list(filter(lambda x: x != "", split_string))

    #enumerate string and filter out instances that aren't the search term
    enum_string = list(filter(lambda x: x[1] == search_term, enumerate(split_string)))

    #loop through each of the items in the enumerated list and save to the current chain
    #once a chain brakes i.e. the next element is not in order append the current_chain to 
    #the chains list and start over
    chains = []
    current_chain = []
    for idx, val in enum_string:
        if len(current_chain) == 0:
            current_chain.append(idx)
        elif idx == current_chain[-1] + 1:
            current_chain.append(idx)
        else:
            chains.append(current_chain)
            current_chain = [idx]
        print(chains, current_chain)    

    #append anything leftover in the current_chain list to the chains list
    if len(current_chain) > 0:
        chains.append(current_chain)
        del current_chain

    #find the max length nested list in the chains list and return it
    max_length = max(map(len, chains)) 
    return max_length


max_length = search_for_term(search_string, search_term)    
print(max_length)
0 голосов
/ 28 марта 2020

Вот как бы я это сделал. сначала проверьте «apple» в randString, затем проверьте «appleapple», затем «appleappleapple» и так далее, пока результат поиска не станет пустым. Следите за количеством итераций и вуаля.

randString = "applebananaorangeorangeorangebananaappleappleorangeappleappleappleapple"
find = input('type in word to search for: ')


def consecutive():
    count =0

    for i in range(len(randString)):
        count +=1
        seachword = [find*count]
        check = [item for item in seachword if item in randString]

        if len(check) != 0:
            continue

        else:
            # Need to remove 1 from the final count.
            print (find, ":", count -1)
            break

consecutive()
...