Woobinda

"The Most Wanted Letter"

Aug 4th, 2016
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.12 KB | None | 0 0
  1. """
  2. Дан текст, который содержит различные английские буквы и знаки препинания. Вам необходимо найти самую частую букву в тексте. Результатом должна быть буква в нижнем регистре.
  3. При поиске самой частой буквы, регистр не имеет значения, так что при подсчете считайте, что "A" == "a". Убедитесь, что вы не считайте знаки препинания, цифры и пробелы, а только буквы.
  4.  
  5. Если в тексте две и больше буквы с одинаковой частотой, тогда результатом будет буква, которая идет первой в алфавите. Для примера, "one" содержит "o", "n", "e" по одному разу, так что мы выбираем "e".
  6. """
  7.  
  8. from functools import reduce
  9. import string
  10.  
  11.  
  12. def most_wanted_letter_v1(text):
  13.     alphabet = [letter for letter in string.ascii_lowercase]
  14.     text = text.lower()
  15.     letters_count = [(letter, text.count(letter)) for letter in alphabet if letter in text]
  16.     max_value = max(arg[1] for arg in letters_count)
  17.     result = [arg[0] for arg in letters_count if arg[1] == max_value]
  18.     return reduce(lambda x, y: x if alphabet.index(x) < alphabet.index(y) else y, result)
  19.  
  20.  
  21. def most_wanted_letter_v2(text):
  22.  
  23.     if not isinstance(text, str):
  24.         raise TypeError('Wrong type of text. Expected a string.')
  25.  
  26.     if not text:
  27.         return 'Letters not found.'
  28.  
  29.     def get_letter_counts(_text):
  30.         counts = {}
  31.         for word in _text.split(' '):
  32.             for let in word.lower():
  33.                 if let.isalpha():
  34.                     try:
  35.                         counts[let] += 1
  36.                     except KeyError:
  37.                         counts[let] = 1
  38.         if not counts:
  39.             raise Exception('Text do not have any alphas')
  40.         return counts
  41.  
  42.     def get_most_wanted_letters(letter_counts):
  43.         sorted_counts = sorted(letter_counts.items(), key=lambda x: x[1])
  44.         max_value = sorted_counts[-1][1]
  45.         wanted_letters = (x[0] for x in sorted_counts if x[1] == max_value)
  46.  
  47.         return wanted_letters
  48.  
  49.     let_counts = get_letter_counts(text)
  50.     most_wanted_letters = get_most_wanted_letters(let_counts)
  51.     first_letter = min(most_wanted_letters, key=lambda x: ord(x))[0]
  52.  
  53.     return first_letter
  54.  
  55.  
  56. if __name__ == '__main__':
  57.     #These "asserts" using only for self-checking and not necessary for auto-testing
  58.     assert checkio("Hello World!") == "l", "Hello test"
  59.     assert checkio("How do you do?") == "o", "O is most wanted"
  60.     assert checkio("One") == "e", "All letter only once."
  61.     assert checkio("Oops!") == "o", "Don't forget about lower case."
  62.     assert checkio("AAaooo!!!!") == "a", "Only letters."
  63.     assert checkio("abe") == "a", "The First."
  64.     print("Start the long test")
  65.     assert checkio("a" * 9000 + "b" * 1000) == "a", "Long."
  66.     print("The local tests are done.")
Add Comment
Please, Sign In to add comment