k najczęstszych słów

Zadanie 9 z 9 · rozdział 22Trudność: 2 z 3sortCounterlambdastring

Treść zadania

Wczytaj liczbę $k$ i tekst. Znajdź $k$ słów, które występują w tekście najczęściej.

Słowa wyznaczamy tak:

  • wielkość liter nie ma znaczenia — cały tekst zamień na małe litery,
  • słowo to ciąg kolejnych liter (znaków, dla których znak.isalpha() jest prawdą, także polskich); wszystkie inne znaki — spacje, cyfry, znaki interpunkcyjne — rozdzielają słowa.

Słowa uporządkuj według liczby wystąpień malejąco, a przy równej liczbie wystąpień — alfabetycznie (rosnąco, według kodów Unicode). Wypisz pierwsze $k$ słów z tej kolejności. Jeśli różnych słów jest mniej niż $k$, wypisz wszystkie.

Dane wejściowe

  • 1. linia: liczba całkowita $k$
  • 2. linia: tekst (zawiera co najmniej jedno słowo)

Dane wyjściowe

Co najwyżej $k$ linii, każda w postaci <słowo> <liczba wystąpień>.

Ograniczenia

  • $1 \le k \le 50$
  • Tekst ma co najwyżej 1000 znaków.

Uwagi

  • Słowa wydzielisz bez wyrażeń regularnych: zamień każdy znak, który nie jest literą, na spację, a potem użyj split().
  • Counter z modułu collections zlicza wystąpienia: Counter(["a", "b", "a"]) daje Counter({'a': 2, 'b': 1}), a .items() zwraca pary (słowo, liczba).
  • Metoda most_common() przy remisie zachowuje kolejność pierwszego wystąpienia, a nie alfabetyczną — dlatego posortuj pary samodzielnie: sorted(licznik.items(), key=lambda p: (-p[1], p[0])).

Przykład

Wejście
3
Ala ma kota, a kot ma Alę. Ala ma też psa!
Wyjście
ma 3
ala 2
a 1

Słowo ma występuje 3 razy, ala — 2 razy, a sześć słów występuje po razie: a, alę, kot, kota, psa, też. Spośród nich alfabetycznie pierwsze jest a.

Potrzebujesz teorii?

Zasady obowiązujące w rozdziale 22

Zadania w tym rozdziale pokazują, jak sortować w praktyce: napisy, słowa, pary, obiekty — często według własnego kryterium. Tutaj wolno (a nawet warto) korzystać z wbudowanych narzędzi Pythona: sorted(), list.sort() i parametru key=.

Konwencje wspólne:

  • Każde zadanie to osobny program: czyta standardowe wejście i wypisuje wynik na standardowe wyjście.
  • Jeśli wejściem jest napis — wczytaj całą linię (łącznie ze spacjami).
  • Jeśli wejściem jest lista — najpierw podana jest liczba elementów $N$, a potem elementy (w jednej linii albo w kolejnych liniach — zależnie od zadania).
  • Napisy porównujemy tak jak Python, czyli według kodów znaków Unicode: wielkie litery są „mniejsze” od małych ('Z' < 'a'), a polskie litery są „większe” od wszystkich liter alfabetu łacińskiego ('z' < 'ą').
  • Sortowanie w Pythonie (sorted(), list.sort()) jest stabilne: elementy równe według kryterium sortowania zachowują kolejność z wejścia. Korzystają z tego zadania, w których mogą wystąpić remisy.
  • Program nie wypisuje komunikatów typu „Podaj liczbę:”.

Zadanie pochodzi z otwartego zbioru Nauka-Programowania (z rozwiązaniami wzorcowymi). Zgłoś błąd w treści lub testach.

Python uruchomi się w przeglądarce przy pierwszym teście.

Kod zapisuje się automatycznie w tej przeglądarce. Tab wstawia wcięcie; aby opuścić edytor klawiaturą, naciśnij Esc, a potem Tab.

Testy

Program dostaje „Wejście” przez input() i musi wypisać „Oczekiwane wyjście”. Liczby porównywane są z tolerancją 0,01, a tekst podany w input("…") nie jest sprawdzany.

Test 1

Nie uruchomiono
Wejście
1
słowo
Oczekiwane wyjście
słowo 1

Test 2

Nie uruchomiono
Wejście
5
To be, or not to be
Oczekiwane wyjście
be 2
to 2
not 1
or 1

Test 3

Nie uruchomiono
Wejście
2
Kot KOT kot! kOt? pies PIES
Oczekiwane wyjście
kot 4
pies 2

Test 4

Nie uruchomiono
Wejście
3
żaba zebra żaba ąb zebra aa
Oczekiwane wyjście
zebra 2
żaba 2
aa 1

Test 5

Nie uruchomiono
Wejście
2
R2D2 i C3PO to roboty, a R2 to robot
Oczekiwane wyjście
r 2
to 2
Uruchom z własnymi danymi