Python

Как это сделать в python или какой алгоритм для этого использовать?

ЕСТЬ СТРОКА:
'семь пятнадцать двадцать один двадцать шесть тридцать один тридцать шесть сорок один сорок шесть пятьдесят один пятьдесят семь шестьдесят два шестьдесят семь семьдесят два семьдесят восемь восемьдесят три девяносто пять девяносто девять сто три'

ЕСТЬ СЛОВАРЬ:
{'один': 1, 'два': 2, 'три': 3, 'четыре': 4, 'пять': 5, 'шесть': 6, 'семь': 7, 'восемь': 8 .......и т.д.}

НАДО ПОЛУЧИТЬ:
[7, 15, 21, 26, 31, 36, 41, 46, 51, 57, 62, 67, 72, 78, 83, 95, 99, 103]

УСЛОВИЯ:
цифры в строке всегда идут по возрастанию. Самое большое число 300.
Преобразование чисел прописью в список чисел за один проход. Самый простой способ решения в лоб:
 numdict = { w: int(n) for s in '''
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 девяносто
100 сто
200 двести
300 триста
'''.split('\n') if s for n, w in (s.split(),) }

r, a = [], []
for w in input().split():
n = numdict[w]
if not a or n < a[-1]:
a.append(n)
else:
r.append(sum(a))
a = [n]
r.append(sum(a))
print(r)
Уж сорян, поленился делать литерал словаря, словарь зачитывается из строки.
В a накапливаем промежуточное число, пока каждый компонент меньше предыдущего. Как только появляется компонент больше предыдущего, сбрасываем накопленное число в список результата r. После цикла остаётся как минимум одно число в аккумуляторе a, поэтому его тоже сбрасываем в результат.

Или функциональный вариант:
 numdict = { w: int(n) for s in '''
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 девяносто
100 сто
200 двести
300 триста
'''.split('\n') if s for n, w in (s.split(),) }

from functools import reduce
def acc(p, n):
r, a = p
return (r + [sum(a)], [n]) if a and n >= a[-1] else (r, a + [n])
r, a = reduce(acc, map(numdict.__getitem__, input().split()), ([], []))
print(r + [sum(a)])
Делает ровно то же самое, только без модификации переменных, и выглядит короче.
ВЯ
Василий Ястребов
12 815
Лучший ответ
Александр Емельянов Супер, Спасибо большое. Очень хорошее решение. Я сделал немного проще, но совсем не так эффективно как у Вас. Это решение действительно топ
 text = 'семь пятнадцать двадцать один двадцать шесть тридцать один тридцать шесть сорок один сорок шесть пятьдесят один пятьдесят семь шестьдесят два шестьдесят семь семьдесят два семьдесят восемь восемьдесят три девяносто пять девяносто девять сто три'.split()

d = {'один': 1, 'два': 2, 'три': 3, 'четыре': 4, 'пять': 5, 'шесть': 6, 'семь': 7, 'восемь': 8 .......и т.д.}

numbers = []
for t in text:
if t in d:
numbers.append(d[t])
print(numbers)

Хотя, не все так просто... Как понять что двадцать и двадцать один это разные числа?
Александр Емельянов К сожалению это не так как надо сработает и результат будет совсем не таким какой нужен(
Серега Перевай аа, тогда да
Александр Емельянов числа идут всегда по возрастанию поэтому после 20 не может идти 1 значит оно будет 21

Вообще хочется как-то проще еще решить эту задачу но пока не придумал ничего лучше чем предложил Vitness
Никакого алгоритма. Взять и сделать. Пройтись циклом и получить значения из словаря
Александр Емельянов не так просто как кажется
Александр Емельянов я уже всю голову сломал) Вроде не выглядит сложно, но когда начинаешь делать возникает много нюансов)

Спасибо большое
Александр Емельянов вот полный список до 110
Александр Емельянов не получается так много текста отправить(