Задать вопрос
@pynew_user

Код не правильно считает слова из файла. Почему и в чем ошибка?

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

В качестве ответа укажите вывод программы, а не саму программу.

Слова, написанные в разных регистрах, считаются одинаковыми.

Sample Input:

abc a bCd bC AbC BC BCD bcd ABC
Sample Output:

abc 3
На вход подается файл(не могу привязать к вопросу). Вот текст файла:
spoiler
Текст файла
ZaYYYT Xbac Z ZdbTXbY badTdXp Uaddbap UU Z pUTadZd Uaddbap ZdbTXbY ZdbTXbY bTdUbd c XY XUTTTZU d pa bUUYa Z bddpXTX bXTUYaX ZdbTXbY ZdbTXbY ZTX ZaZUZT YXYZa bY bUUYa c TcZUU
ddTbZXXb ddTbZXXb ddTbZXXb ddTbZXXb UccUZp XUppdTXd b ddTbZXXb ddTbZXXb ZTpccTXb ZTpccTXb ddTbZXXb pTaUbU ab YaX ddTbZXXb ZcTcaTUZ
cXcZXc TdTUXaTa ccbcYdUcY bpdcYXcZ ZpaZcXd b pUcYYa bpdcYXcZ pUcYYa cXcZXc pXcT bpdcYXcZ adZppYaY bUdap pacddb dTbbZ ZUXd pUcYYa pXcT YaYcUYZdd dY YbddUpcTZ dUdTXda aUU ppYbTcddp aUbYbYUZ UbbYa aUbYbYUZ TpcXaZaZ aUbYbYUZ UXUadaXc UZdda XTpT bdXddbZY aUbYbYUZ UXUadaXc YTZYaTXXZ pUbU U cTbp dUZ apaXcaZdd TppppT TpbbpU TbZXU Taad ZdcUp p bpTTppUY aUbYbYUZ XY ZZpcdp cpTXTUaZY
cbcpaZYba YpXcd d apUZ YacXTpa d apUZ Yc apUZ d cTppTZ apUZ TZcYXXZcU pZd ZXZYYZ XcT apUZ cccaYZb ddZpT aTTZYc dYc pbcZYdZaa dTd UYZU a pbcZYdZaa d UaZ apUZ Zcb UYZU cbTdUbaYb YU apUZ aYTccpb X
adadpUpY UX UX aZTT aZTT cUdpbc cZbZbX UX dYd YY pX Tac cb UX baYU TdYdpd X UX ccZUZXY YcpXbdU dZdZpTT cTY XZUXpUZ UZYUT ppdZYdU YcpXbdU cd b bapaUX YXTpdTa paUY pZaYX aZTT TdcZXT ZYpX TdcZXT TYdY c aZTT acXYUbbTb dZdZpTT pabb pcUTbcdpZ bXZU apXZadY ZcYbdZpa paUY
XYY XYY XYY Y XYY UbpabT c aX XTd U TpTbaZa Y pXXYbcpZY pXXYbcpZY cTY Z ppbYb pddZU pXXYbcpZY XYY ZXX UZZ YpbZY TXbTXdTb bdYc pZ UXUbX UUcYpXY UdYZ bZpUZXbaX T YapXX TapZY UTcUaccT Y UTcUaccT pXXYbcpZY UbbcXUcc bdYc pZ apdpbY ZUbXYUTX UZZ bY TppadYYp bZaUpa bbYUUTT aXdaTabT XYY daUTUad Zc
da ddZ cca aXpaY aXpaY bZZ bcd da ddZ ddZ bcd dcpYUT pY bcd acTYYUUZ da YTY bcd aXpaY ZapbYZYc ZXXa ddZ cXcppba abZda X acTYYUUZ bcd dacTUaY pUdbUUbb UXdXbcX pY aXa Ua T UZYUp T YUZaZ TaTYYcZ bZYpp ppadcYaba ppY ddZ
aZ XaUc ZZapX ZZapX aXXXYT bdTdUU ZZapX aZ Tabpb aUYUZpUY cZab UZ ZZapX UZ ccaUZa aaTTdTZ YUUa aZpYY ZYYZY aXXXYT U YZTY dU TdaYXUcc dYbZ dU TTdYU ZdcXUp
YcU aTcU UaZ XYYXaaUb XYYXaaUb XYYXaaUb XYYXaaUb YcU YU XYYXaaUb YcU bccd dddaadaY XZTdY XZTdY a dp TYXTp bdY UaZ pXaYY YcU TZ bdY YcU XaUUpaU pcYYXXZd YcU XZTdY ddZ cbUUY dUaZXc XXbT bUUZcT XYYXaaUb XTZZpYpZX TZaYc dYZ bdY cUbUZYap UcpccXd XadZpUY cUTZpZ UaZ XYYXaaUb aabXbdcb
YXZXbbcZb YdXUU dUcd UpZbTX adZdUTp adZdUTp YdXUU UaYYYcZ YXZXbbcZb p dUcd YdXUU adZdUTp ZppbUY ba UTZdZdY ab ZppbUY dd ba ZUTTaXbpb UpZbTX UTZdZdY pX aaUZXZ ab dUcd pppTTXUZp adZdUTp YTpa Zbpc ZppbUY UpZbTX db ab X dUcd ZXpXUZ dUcd dcTaXZaX ba d Ybc ZppbUY X pdcYbYdZ
bZZb dZpUUUX pcT cTb dZpUUUX ab bZZb bZZb ZTUbZU dZpUUUX ab ZdZTpb ab cX caYdYdaZa ab ab pT bZZb ZUUXXadaa TaUbdZa bpdc dbZbbXpcd abYpdTada XYcTcZd bZZb Upa b aXcZbXUXb XbU XbU UUpYbpda
Tcb dd Tcb a pdcXc Tcb Ub Tcb X XXpZcdUYX appTdZ UXZ XXpZcdUYX UXZ Ub ZZadTbbY ad Tcb XaacZUad TbpddZ a XccbZpbaX acUT aXY cpUd ZYcYdZdUp ZU dZ ZXbdZbdZU U XTdbUTU UcadYc Tcb ZZadTbbY appTdZ UXZ XZaad Tcb XdYd Tcb YUTYUpZ acaZaTba b YUTYUpZ dd
TppcYcpcb c c dYapd U Y ZpapbU dT c addbYTTdT cYYcXpYd bb a
paZbabXZ paZbabXZ abpUddd paZbabXZ U pZaTTb ZZdbdccb bXcXZpYb UXTpXTpTY c d XcacbbU ZZ bbUc XXcZYZZXb TpcZaZp c XpTbcdbc cTTZX YX TpcZaZp bp XcacbbU ZZ dapYa TabTacZ cUTYT ZZ pXc bpYpdcc ccYpTpUZZ abpUddd aUXXTd XcacbbU XcacbbU TpcZaZp ZTY ZdpXX TpcZaZp ppZZ aUXXTd Z dU YX
dcYbYZYdX TZaadbTTZ Y ZZZ bTUaUbd bdbX caZZbdaT bUTTpbccc XpaXYTcp ZZZ XccTUUY bbpcbpZc dXddbTa aTZppT TZaadbTTZ ZZZ dXddbTa UacTpTbb TabaZ TZaadbTTZ cZXdadU YddTcUpdd XdcXb ZZZ bdbX dY XZT bbpcbpZc YddTcUpdd YddTcUpdd Y paU pdab UpYddU bcdYaU bdbX aXUpaUd b TZaadbTTZ bcdYaU XccTUUY Yaabc bcdYaU YacpX ZZXTZ ZUdYUTc bbpcbpZc d cTd aYUUd ZYppUdUZX dY pXpZd
cbYbdd cbYbdd dY bTXYpcbb YdbYTUpZ U pU YdbYTUpZ aXppaXb YdbYTUpZ U cbYbdd bYZTa bYZTa U cbYbdd cbYbdd cbYbdd ZZpb dpapX U XT U XT XpdaYXX aTdpYZZb bYdZ XT XdTUd bcdUYTpT ddYdXd bpZ YYUaYUdT cbYbdd p
bYYTUpaTd pcp aUbZ YZUbUdZZ pcp aUbZ ZpXpTbdUd ZpXpTbdUd XTT ZpXpTbdUd dbdbUY YpYcTdTU ZpXpTbdUd dXYpXaT YcaTX cTY pcp b ppUYcZYUY b X aXZpaYX YZUbUdZZ UYUcYaZdT XYXcXb Za adXpd UYUcYaZdT Za UXadXaad UbbaaZZUX pYYZdpYa Z ZpUXXbp UYUdYpdT pad ccbbcUaZ TUTbUXcdb cZbbp ZbaX
Z UUXTa cXTXZbUba TXXXbUbY Z p TXXXbUbY badX UUXTa Z TXXXbUbY X pXabXbYaU p
UZ YTbapTb YTbapTb ZYbdTd UZ UZ YYY ppdbpaZ acYUd pXTZYYc ZUYdTY c XTTbT ccTYZ pXTZYYc bUaU YTbapTb ZZbTXcUad dacYd T ccXTX pXTZYYc pdY bZbUdZbXp cb pbpaTTb XTTbT p ddaXYbUU UaZYpdY


Согласно условию я написал код, но почему-то он не правильно считает самое популярное слово. Мой вывод: xttbt 2
Мой код:

slov={}
with open('C:\\Users\\telel\\Downloads\\dataset_3363_3.txt') as inp:
    for line in inp:
        line=line.lower()
        for i in line.split():
            if i not in slov:
                slov[i]=1
            elif i in slov:
                slov[i]+=1
max_value=1
for key,value in slov.items():
            primary=slov[key]
            if primary>max_value:
                max_key=primary
                max_slov=key
with open('C:\\Users\\telel\\Downloads\\dataset_3363_3.txt', 'w') as out:
    popular=(max_slov + ' ' + str(max_key))
    out.write(popular)


По идее он должен записывать самое популярное значение и складывать с ключём. Так же не могу реализовать условие "Если таких слов несколько, вывести лексикографически первое (можно использовать оператор < для строк)." Просьба дать разъяснение.
  • Вопрос задан
  • 328 просмотров
Подписаться 1 Простой 6 комментариев
Пригласить эксперта
Ответы на вопрос 2
@MadLor
Вот здесь
if primary>max_value:
                max_key=primary
                max_slov=key

надо добавить max_value = primary т.е.
if primary > max_value:
        max_key = primary
        max_slov = key
        max_value = primary

у вас же изменилось "текущее" максимальное значение, а вы этого не учли... Это по первому вопросу.
По поводу
Так же не могу реализовать условие "Если таких слов несколько, вывести лексикографически первое (можно использовать оператор < для строк)." Просьба дать разъяснение.

Я бы на Вашем месте просто отсортировал словарь по возрастанию (убыванию) значений и на последних(первых) двух(или более) ключах сравнил значения и из этого уже делал бы выводы - одно слово встречается максимальное кол-во раз или несколько слов.
P.S. с помощью операторов < и > можно сравнивать не только числовые значения, но и строки.
Ответ написан
Ternick
@Ternick
Мой вариант:
CODE

def main():
	list_from_line = []
	with open("input.txt") as f:
		for line in f:
			list_from_line += line.lower().strip().split()

	unique_keys = set(list_from_line)

	top = {
		key: list_from_line.count(key) for key in unique_keys
	}

	max_count = max(top.values())

	top_items = [item for item in top.items() if item[1] == max_count]

	result = min(top_items, key = lambda x: x[0])

	print(f"{result[0]} {result[1]}")

if __name__ == "__main__":
	main()



Не претендую на понятность)
Так как обычно пишу код стараясь использовать уже готовые функции.
Думаю работает.

Результат первого теста:
abc 3
Результат второго теста:
u 11

Если что-то непонятно, могу объяснить, но рекомендую всё таки разобраться самому)
Курсы лучше проходить самостоятельно, это не самое сложное задание, что я видел)
Что будет дальше? Когда пойдут задания по сложнее?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы