class Ctecka: def precti_slovo(self): pass class Slovnik: def zapocitej_slovo(self, slovo): pass def vrat_nejcastejsi_slova(self, pocet): pass class Tiskarna: def vytiskni_seznam(self, seznam): pass ###################################################### KONEC = "konec" class CteckaPoRadkach: def precti_slovo(self): return input("Zadej slovo:") class CteckaZeStringu: def __init__(self, string): self.zbytek = string.split() def precti_slovo(self): if self.zbytek == []: return KONEC return self.zbytek.pop(0) class CteckaSeZbytkem: def __init__(self): self.zbytek = [] def precti_slovo(self): while self.zbytek == []: self.zbytek = input().split() return self.zbytek.pop(0) def precti_cislo(self): return int(self.precti_slovo()) class CteckaZeSouboru: def __init__(self, jmeno): self.soubor = open(jmeno, 'r', encoding="utf-8") self.zbytek = [] def precti_slovo(self): while self.zbytek == []: radka = self.soubor.readline() if radka == "": # eof! self.soubor.close() print("Zaviram soubor") return KONEC self.zbytek = radka.split() return self.zbytek.pop(0) class CteckaNeVelka: def __init__(self, ctecka): self.ctecka = ctecka def precti_slovo(self): slovo = self.ctecka.precti_slovo() while (slovo != KONEC) and (slovo == slovo.upper()): slovo = self.ctecka.precti_slovo() return slovo class CteckaVelka: def __init__(self, ctecka): self.ctecka = ctecka def precti_slovo(self): slovo = self.ctecka.precti_slovo() while (slovo != KONEC) and (slovo != slovo.upper()): slovo = self.ctecka.precti_slovo() return slovo class CteckaMinDelka: def __init__(self, ctecka, mindelka): self.ctecka = ctecka self.mindelka = mindelka def precti_slovo(self): slovo = self.ctecka.precti_slovo() while (slovo != KONEC) and (len(slovo) < self.mindelka): slovo = self.ctecka.precti_slovo() return slovo #----------------------------------------------------- class SlovnikVDictionary: def __init__(self): self.seznam = dict() def zapocitej_slovo(self, slovo): if slovo not in self.seznam: self.seznam[slovo] = 0 self.seznam[slovo] += 1 def vrat_nejcastejsi_slova(self, pocet): vystup = [] for i in range(pocet): nej_slovo = None nej_pocet = 0 for slovo in self.seznam: if self.seznam[slovo] > nej_pocet: nej_slovo = slovo nej_pocet = self.seznam[slovo] if nej_pocet > 0: vystup.append((nej_slovo, nej_pocet)) self.seznam[nej_slovo] = -self.seznam[nej_slovo] # ...zase obnovit... return vystup #----------------------------------------------------- class TiskarnaNaKonzoli: def __init__(self): pass def vytiskni_polozku(self, slovo, pocet): print( f"{pocet:5d} {slovo}") def vytiskni_seznam(self,seznam): print( "---------------------" ) print( "pocet slovo" ) print( "---------------------" ) for polozka in seznam: self.vytiskni_polozku(polozka[0], polozka[1]) print( "---------------------" ) import webbrowser from datetime import datetime class TiskarnaDoHTML: def __init__(self): pass def vytiskni_polozku(self, slovo, pocet): self.file.write(f"{pocet}{slovo}\n") def vytiskni_seznam(self,seznam): url=datetime.now().strftime("%y%m%d_%H%M%S")+".html" self.file = open(url, 'w', encoding='utf-8') self.file.write("\n") for polozka in seznam: self.vytiskni_polozku(polozka[1], polozka[0]) self.file.write("
") self.file.close() webbrowser.open_new_tab(url) ###################################################### #ctecka = CteckaPoRadkach() #ctecka = CteckaZeStringu("a b c b c d e d s a a a s a s d f d e d f d d c d konec") #ctecka = CteckaSeZbytkem() #ctecka = CteckaZeSouboru("251118_slova.py") #ctecka = CteckaZeSouboru("romeo-and-juliet_TXT_FolgerShakespeare.txt") #ctecka = CteckaVelka( # CteckaMinDelka( # # CteckaZeSouboru("romeo-and-juliet_TXT_FolgerShakespeare.txt"), # # CteckaZeSouboru("hamlet_TXT_FolgerShakespeare.txt"), # CteckaZeSouboru("the-merchant-of-venice_TXT_FolgerShakespeare.txt"), # 3) # ) slovnik = SlovnikVDictionary() tiskarna = TiskarnaNaKonzoli() #tiskarna = TiskarnaDoHTML() #------------------------------ class CteckaSBlacklistem: def __init__(self, ctecka, blacklist): self.ctecka = ctecka self.blacklist = blacklist def precti_slovo(self): slovo = self.ctecka.precti_slovo() while (slovo != KONEC) and (slovo in self.blacklist): slovo = self.ctecka.precti_slovo() return slovo #ctecka = CteckaZeStringu("a b c d e f g h i j k d e f a a a b b c konec") # ctecka = CteckaZeSouboru("251118_slova.py") ctecka = CteckaSBlacklistem( CteckaZeSouboru("romeo-and-juliet_TXT_FolgerShakespeare.txt"), ['I', 'and', 'to', 'the', 'a', 'of', 'is', 'in', 'that', 'And', 'you', 'not', 'be', 'me', 'my', 'with', 'thou', 'this', 'for', 'thy', 'it', 'his', 'her'] ) # https://folger-main-site-assets.s3.amazonaws.com/uploads/2022/11/romeo-and-juliet_TXT_FolgerShakespeare.txt slovnik = SlovnikVDictionary() tiskarna = TiskarnaNaKonzoli() #tiskarna = TiskarnaDoHTML() def NejcastejsiSlova(pocet, ctecka, slovnik, tiskarna): while (slovo := ctecka.precti_slovo()) != KONEC: slovnik.zapocitej_slovo(slovo) nejcastejsi_slova = slovnik.vrat_nejcastejsi_slova(pocet) tiskarna.vytiskni_seznam(nejcastejsi_slova) NejcastejsiSlova(10, ctecka, slovnik, tiskarna)