Распознавание чисел, записанных прописью от 1 до 99

Суть в том, что мне нужно чтобы строка(например: сорок три) преобразовалась в число(43) с использованием кортежей. Я пытался что-то сделать сам, но код не выводит числа.

numberstuple = (('нуль', 0), ('один', 1), ('два', 2), ('три', 3), ('четыре', 4), ('пять', 5), ('шесть', 6), ('семь', 7), ('восемь', 8), ('девять', 9),
                 ('десять', 10), ('одиннадцать', 11), ('двенадцать', 12), ('тринадцать', 13), ('четырнадцать', 14), ('пятнадцать', 15), ('шестнадцать', 16), ('семнадцать', 17), ('восемнадцать', 18), ('девятнадцать', 19),
                 ('двадцать', 20), ('тридцать', 30), ('сорок', 40), ('пятьдесят', 50), ('шестьдесят', 60), ('семьдесят', 70), ('восемьдесят', 80), ('девяносто', 90))
def process_input_numbers(input_numbers):
    total_sum = 0
    single_numbers = [num for num in input_numbers if num not in ['десять', 'двадцать', 'тридцать', 'сорок', 'пятьдесят', 'шестьдесят', 'семьдесят', 'восемьдесят', 'девяносто']]
    composite_numbers = [num for num in input_numbers if num in ['десять', 'двадцать', 'тридцать', 'сорок', 'пятьдесят', 'шестьдесят', 'семьдесят', 'восемьдесят', 'девяносто']]
    for num_word in composite_numbers:
        if num_word == 'десять':
            total_sum += 10
        elif num_word == 'двадцать':
            total_sum += 20
        elif num_word == 'тридцать':
            total_sum += 30
        elif num_word == 'сорок':
            total_sum += 40
        elif num_word == 'пятьдесят':
            total_sum += 50
        elif num_word == 'шестьдесят':
            total_sum += 60
        elif num_word == 'семьдесят':
            total_sum += 70
        elif num_word == 'восемьдесят':
            total_sum += 80
        elif num_word == 'девяносто':
            total_sum += 90
    for num_word in single_numbers:
        for num_name, num_value in numberstuple:
            if num_word == num_name:
                total_sum += num_value
    return total_sum
N = int(input("Введите количество чисел для обработки: "))
result_sum = 0
while N != 0:
    input_numbers = input()
    result_sum += process_input_numbers(input_numbers)
    N -= 1
print("Сумма входных чисел:", result_sum) 

Спасибо за внимание и да пребудет с вами сила.


Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Циклы сделаны по буквам, не по словам. Поправьте в двух местах

[num for num in input_numbers ...]

[num for num in input_numbers.split() ...].

Но не проще ли сделать решение более прямолинейным?

def numeric_value(text):
    values = {
        'один': 1,
        'два': 2,
        'три': 3,
        'четыре': 4,
        'пять': 5,
        'шесть': 6,
        'семь': 7,
        'восемь': 8,
        'девять': 9,
        'десять': 10,
        'одиннадцать': 11,
        'двенадцать': 12,
        'тринадцать': 13,
        'четырнадцать': 14,
        'пятнадцать': 15,
        'шестнадцать': 16,
        'семнадцать': 17,
        'восемнадцать': 18,
        'девятнадцать': 19,
        'двадцать': 20,
        'тридцать': 30,
        'сорок': 40,
        'пятьдесят': 50,
        'шестьдесят': 60,
        'семьдесят': 70,
        'восемьдесят': 80,
        'девяносто': 90
    }
    return sum(values[w] for w in text.split())
→ Ссылка