Advertisement
BERKYT

numbers

Dec 13th, 2021 (edited)
1,313
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.04 KB | None | 0 0
  1. from text_to_num import text2num
  2. from collections import Counter
  3.  
  4. # Перевести на французский!!!
  5. # ---------------------
  6. g_lang = "en"
  7. # ---------------------
  8.  
  9.  
  10. # Не смотри на эту функцию - она большой костыль, потому что мне было лень думать
  11. # А вообще эта функция фильтрует слова, которые не подхоят text_to_num
  12. # Благодаря этой функции эта прога подходит ко всем языкам.
  13. def func_find_word_num(list_words):
  14.     list_words_checker = []
  15.  
  16.     for word in list_words:
  17.         # Костыль для английского языка. Почему - то эта библиотека не понимает слово million итд, но вот слово
  18.         # thousand, например, она может понять. Странно :ъ
  19.         if 'illion' in word and g_lang == "en":
  20.             list_words_checker.append(word)
  21.             continue
  22.  
  23.         try:
  24.             text2num(word, lang=g_lang)
  25.         except:
  26.             continue
  27.         else:
  28.             list_words_checker.append(word)
  29.  
  30.     return list_words_checker
  31.  
  32.  
  33. # Эта функция переводит арабские цифры в римские.
  34. def func_check_io(n):
  35.     result = ''
  36.  
  37.     for arabic, roman in zip((1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1),
  38.                              'M     CM   D    CD   C    XC  L   XL  X   IX V  IV I'.split()):
  39.         result += n // arabic * roman
  40.         n %= arabic
  41.  
  42.     return result
  43.  
  44.  
  45. # Эта функция просто считает сколько раз то или иное слово встретилось в списке
  46. def func_count_numbers_in_list(list_words):
  47.     return dict(Counter(list_words))
  48.  
  49.  
  50. # Эта функция просто считает сколько раз повторилось слово, которое не должно было повторяться.
  51. def func_count_repeat_numbers_in_list(list_words):
  52.     list_words_repeat = []
  53.  
  54.     for index in range(1, len(list_words)):
  55.         if list_words[index - 1] == list_words[index]:
  56.             list_words_repeat.append(list_words[index])
  57.         else:
  58.             continue
  59.  
  60.     return dict(Counter(list_words_repeat))
  61.  
  62.  
  63. # Эта функция генерирует список слов, которые являются цифрой так или иначе.
  64. def func_split_str_numbers(line):
  65.     list_words = line.split()
  66.     list_word_result = []
  67.  
  68.     for word in list_words:
  69.         for word_check in set(func_find_word_num(list_words)):
  70.             if word == word_check:
  71.                 list_word_result.append(word)
  72.             else:
  73.                 continue
  74.  
  75.     return list_word_result
  76.  
  77.  
  78. # Главная функция
  79. def main():
  80.     while True:
  81.         number = input('\nВведите число: ').lower()
  82.  
  83.         if number == 'stop':
  84.             break
  85.  
  86.         try:
  87.             print('Arabic =', text2num(number, lang=g_lang))
  88.             print('Roman =', func_check_io(text2num(number, lang=g_lang)))
  89.         except Exception as e:
  90.             length = len(str(repr(e)))
  91.  
  92.             print('-' * length, '\nОшибка!\n')
  93.  
  94.             dict_repeat_num = func_count_repeat_numbers_in_list(func_split_str_numbers(number))
  95.             dict_num = func_count_numbers_in_list(func_split_str_numbers(number))
  96.  
  97.             set_incorrect_words = set(number.split())
  98.             set_repeat_num = set(dict_num.keys())
  99.             set_incorrect_words -= set_repeat_num
  100.  
  101.             for key in dict_repeat_num:
  102.                 print('* {} повторяется {} лишний(их) раз'.format(key, dict_repeat_num[key]))
  103.  
  104.             if set_incorrect_words != set():
  105.                 print('Некорректные слова:', set_incorrect_words)
  106.  
  107.             print('\nПодробнее:\n', repr(e), '\n', '-' * length)
  108.  
  109.  
  110. # Точка входа в программу
  111. if __name__ == '__main__':
  112.     main()
  113.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement