from text_to_num import text2num
from collections import Counter
# Перевести на французский!!!
# ---------------------
g_lang = "en"
# ---------------------
# Не смотри на эту функцию - она большой костыль, потому что мне было лень думать
# А вообще эта функция фильтрует слова, которые не подхоят text_to_num
# Благодаря этой функции эта прога подходит ко всем языкам.
def func_find_word_num(list_words):
list_words_checker = []
for word in list_words:
# Костыль для английского языка. Почему - то эта библиотека не понимает слово million итд, но вот слово
# thousand, например, она может понять. Странно :ъ
if 'illion' in word and g_lang == "en":
list_words_checker.append(word)
continue
try:
text2num(word, lang=g_lang)
except:
continue
else:
list_words_checker.append(word)
return list_words_checker
# Эта функция переводит арабские цифры в римские.
def func_check_io(n):
result = ''
for arabic, roman in zip((1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1),
'M CM D CD C XC L XL X IX V IV I'.split()):
result += n // arabic * roman
n %= arabic
return result
# Эта функция просто считает сколько раз то или иное слово встретилось в списке
def func_count_numbers_in_list(list_words):
return dict(Counter(list_words))
# Эта функция просто считает сколько раз повторилось слово, которое не должно было повторяться.
def func_count_repeat_numbers_in_list(list_words):
list_words_repeat = []
for index in range(1, len(list_words)):
if list_words[index - 1] == list_words[index]:
list_words_repeat.append(list_words[index])
else:
continue
return dict(Counter(list_words_repeat))
# Эта функция генерирует список слов, которые являются цифрой так или иначе.
def func_split_str_numbers(line):
list_words = line.split()
list_word_result = []
for word in list_words:
for word_check in set(func_find_word_num(list_words)):
if word == word_check:
list_word_result.append(word)
else:
continue
return list_word_result
# Главная функция
def main():
while True:
number = input('\nВведите число: ').lower()
if number == 'stop':
break
try:
print('Arabic =', text2num(number, lang=g_lang))
print('Roman =', func_check_io(text2num(number, lang=g_lang)))
except Exception as e:
length = len(str(repr(e)))
print('-' * length, '\nОшибка!\n')
dict_repeat_num = func_count_repeat_numbers_in_list(func_split_str_numbers(number))
dict_num = func_count_numbers_in_list(func_split_str_numbers(number))
set_incorrect_words = set(number.split())
set_repeat_num = set(dict_num.keys())
set_incorrect_words -= set_repeat_num
for key in dict_repeat_num:
print('* {} повторяется {} лишний(их) раз'.format(key, dict_repeat_num[key]))
if set_incorrect_words != set():
print('Некорректные слова:', set_incorrect_words)
print('\nПодробнее:\n', repr(e), '\n', '-' * length)
# Точка входа в программу
if __name__ == '__main__':
main()