Проблема с поиском количества вхождения элемента

Всем привет! Задача простая и решение тоже, но не понимаю где не работает. 3.4 Напишите программу, которая считывает текст из файла (в файле может быть больше одной строки) и выводит самое частое слово в этом тексте и через пробел то, сколько раз оно встретилось. Если таких слов несколько, вывести лексикографически первое (можно использовать оператор < для строк). Моя логика решения: прочитал текст в переменную, сделал множество, чтобы в цикле избавиться от повторов (и для удобства отсортировал его), потом прохожу по множеству и определяю количество вхождения элемента в первоначальном тексте. Но ответ неправильный, всегда выдает последний элемент, будто не проверяет в цикле условие =( Заранее спасибо!

with open('inputfile.txt', 'r') as file:
    text = file.read().lower().split()
    text_set = list(set(text))  # сделал множество для исключения повторений
    text_set.sort()
    i = 0
    max_char = text_set[0]
    max_count = text.count(text_set[0])
    # перебираю элементы из множества и смотрю количество их вхождений
    while i < len(text_set) - 1:
        if text.count(text_set[i]) < text.count(text_set[i + 1]):
            max_char = text_set[i + 1]
            max_count = text.count(text_set[i + 1])
        elif text.count(text_set[i]) == text.count(text_set[i + 1]):
            if text_set[i] < text_set[i + 1]:
                max_char = text_set[i]
                max_count = text.count(text_set[i])
        i += 1
    print(max_char, max_count)

['bbp', 'upxppuu', 'pb', 'tzu', 'taxzu', 'dubtcpd', 'uta', 'cdt', 'zbz', 'tzu', 'taxzu', 'tttxbyc', 'ud', 'xazcy', 'ypyppaxyu', 'dbbcybd', 'acyz', 'byadcau', 'xtxdc', 'caatdz', 'ptbdudpdt', 'dcaazyax', 'yabuxzzpb', 'abb', 'bz', 'yabuxzzpb', 'duzpxcup', 'yduxdt', 'pdz', 'bbua', 'udda', 'd', 'xtxdc', 'azu', 'xtxdc', 'cbaz', 'zudx', 'xyauub', 'apcbzypzz', 'bz', 'ztbyzcyt', 'pc', 'cxyb', 'zabddaba', 'apdzduu', 'zcbtydc', 'ubxuc', 'dp', 'ubxuc', 'zc', 'tzb', 'yuu', 'xtdz', 'p', 'dada', 'uubyp', 'tzb', 'pdcyux', 'xtdz', 'tzdz', 'xuautua', 'uuucxduaz', 'tpdazcab', 'xcdtpdu', 'ubauzduua', 'tpdazcab', 'uz', 'yuu', 'xpupyyp', 'cyctxxtau', 'tbdzdxca', 'dtpadcxy', 'yuu', 'dupy', 'uzuztb', 'cpxxbcz', 'tydz', 'tzb', 'dbutxd', 'dczzuyx', 'yuu', 'dczzuyx', 'zbxtzpxu', 'tu', 'up', 'zta', 'xcdtpdu', 'axc', 'yyazpuuzy', 'cyctxxtau', 'axpdcabc', 'xcdtpdu', 'tpdazcab', 'dccdc', 'c', 'xcdtpdu', 'cy', 'dtpadcxy', 'bp', 'dupy', 'aycxbapyt', 'tyubtcp', 'pxa', 'pxa', 'dpzzc', 'pdxdzc', 'tbbuudpcz', 'pxbcczc', 'pxa', 'zbt', 'pxa', 'pxa', 'bz', 'ddutu', 'aycxbapyt', 'dxtb', 'yab', 'pxa', 'xutc', 'udzbyuuz', 'zbt', 'zzypy', 'b', 'tyubtcp', 'tbbuudpcz', 'dxz', 'tzuccuyy', 'tbbuudpcz', 'yuyz', 'tu', 'dpzzc', 'yyudatpa', 'xutc', 'uzcx', 'pu', 'dc', 'azdty', 'dpzzc', 'pxa', 'xaxy', 'pyz', 'bxaby', 'z', 'ydt', 'tyxzaza', 'ytyybx', 'dta', 'ubx', 'udzbyuuz', 'ytpauzbca', 'xdxaxbyu', 'zutpzt', 'xdxaxbyu', 'xyuduttp', 'acdxz', 'xyuduttp', 'ccbx', 'zcy', 'xtzbdcb', 'ccbx', 'ctbyuybd', 'ccbx', 'aacpta', 'yzabdaby', 'cdc', 'ctbyuybd', 'u', 'u', 'pbcdxzy', 'dypxpatc', 'xyuduttp', 'abaddz', 'dypxpatc', 'aacpta', 'u', 'x', 'zdbupyyu', 'bu', 'acdxz', 'z', 'bxubcp', 'cdc', 'zxpxadu', 'z', 'pbcdxzy', 'ccbx', 'xyuduttp', 'bcayytudc', 'baaypp', 'bd', 'xcdd', 'ptcu', 'cbcuzxcd', 'yuuptud', 'xtta', 'bu', 'ayuzub', 'ayuzub', 'xycaxaud', 'yd', 'db', 'buubd', 'cyttypz', 'bubbzduz', 'cauyy', 'xycaxaud', 'xy', 'buubd', 'zyatptucb', 'x', 'uddzppx', 'daxyabubt', 'uu', 'bubbzduz', 'bzxpdpyz', 'bubbzduz', 'cauyy', 'xycaxaud', 'uddzppx', 'ypx', 'y', 'bpta', 'ytzcz', 'zaapxdt', 'c', 'yzauxczax', 'pdzbxcyx', 'ptxbzap', 'yzauxczax', 'yd', 'yzauxczax', 'z', 'tt', 'yzauxczax', 'ddaauc', 'yzauxczax', 'pdzbxcyx', 'ddzxbddy', 'ddaauc', 'txdudzauy', 'tt', 'dpxdbp', 'txdudzauy', 'tt', 'dpxdbp', 'tz', 'txdudzauy', 'cad', 'zdubby', 'dpxdbp', 'txdudzauy', 'yyx', 'd', 'zyz', 'ady', 'bx', 'x', 'zdx', 'adxtaz', 'btpxpp', 'apuy', 'dpaputyt', 'ady', 'pcbppax', 'dpxdbp', 'ytpbbtxp', 'zyz', 'cc', 'uaxy', 'tb', 'by', 'bpa', 'by', 'txpptu', 'udcbat', 'txdd', 'xx', 'udcbat', 'zxdzyyc', 'bpa', 't', 'p', 'ybyd', 'tbuc', 'pzaxbx', 'baxxuypu', 'zy', 'p', 'bpa', 'ptpb', 'pzax', 'y', 'cddt', 'ptpb', 'zbd', 'ydpyctx', 'baxxuypu', 'cc', 'baxucdu', 'dpddxpz', 'xx', 'cadc', 'p', 'cdzzztycc', 'zbd', 'pzczpyytb', 'pcxtdc', 'tccztyp', 't', 'pbyxcxbpb', 'cdtuyptuu', 'axxxc', 'zyuz', 'pzczpyytb', 'cdyax', 'cc', 'dzpttzyxp', 'dzpttzyxp', 'dzpttzyxp', 'uzyaztdbb', 'dzpttzyxp', 'dzpttzyxp', 'dzpttzyxp', 'dzpttzyxp', 'payz', 'daxaazc', 'z', 'cyzty', 'ytta', 'dzpttzyxp', 'bzzxzzy', 'pbad', 'dzpttzyxp', 'ubxxdtzpy', 'yutpcbty', 'dzpttzyxp', 'dzpttzyxp', 'dc', 'pc', 'uzyaztdbb', 'abctzzzz', 'dzpttzyxp', 'dpcxpctdz', 'c', 'tcd', 'padac', 't', 'pddbyya', 'pbazu', 'uydaxtxp', 'ap', 'dc', 'ypa', 'ycupaupzx', 'zdy', 'y', 'apaba', 'dzpttzyxp', 'dxcuacapc', 'pduxxbdtt', 'ap', 'ap', 'puyuda', 'pd', 'c', 'd', 'd', 'aazyyab', 'aazyyab', 'aazyyab', 'bbzapp', 'zcuxpyaca', 'pcatb', 'tptu', 'yxpyptbd', 'atyyzpupx', 'bddayt', 'aputupcxb', 'ty', 'bddayt', 'aazyyab', 'xaaaapbza', 'aazyyab', 'uab', 'aazyyab', 'cxbp', 'd', 'dxdatuzbc', 'pyx', 'cuayct', 'p', 'cxxaucbu', 'tt', 'cxza']


Ответы (1 шт):

Автор решения: Сергей

Вы не те элементы сравнивали, да и знак в лексикографике сомнительный. Общую эффективность алгоритма оптимизировать не стал. Смотрите на комментарии со словом "Коррекция". В коде ниже чтение из файла заменил на короткий тестовый пример. Выдаёт на выходе "bbp 2", как и надо.

text = ['bbp', 'upxppuu', 'bbp', 'upxppuu', 'pb']
text_set = list(set(text))  # сделал множество для исключения повторений
text_set.sort()
i = 0
max_char = text_set[0]
max_count = text.count(text_set[0])
# перебираю элементы из множества и смотрю количество их вхождений
while i < len(text_set) - 1:
    a1 = text.count(text_set[i])
    a2 = text.count(text_set[i + 1])
    # Коррекция: сравнивать с максимумом надо - заменил на max_count
    if max_count < text.count(text_set[i + 1]):
        max_char = text_set[i + 1]
        max_count = text.count(text_set[i + 1])
    elif max_count == text.count(text_set[i + 1]):
        # Коррекция: сравниваем с максимумом - заменил на max_count и знак поменял на >
        if max_char > text_set[i + 1]:
            max_char = text_set[i+1]
            max_count = text.count(text_set[i+1])
    i += 1
print(max_char, max_count) 


→ Ссылка