Как отсортировать числа в алфавитном порядке их текстовых названий?

Рейтинг: 3Ответов: 1Опубликовано: 10.03.2023

Программа выписала названия всех целых чисел от 0 до 20 и расположила их в алфавитном порядке:

numbers = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen', 'twenty']
number_dict = {number: index for index, number in enumerate(numbers)}

# Создаём список чисел, отсортированных по алфавиту их названий
sorted_numbers = [number_dict[key] for key in sorted(number_dict.keys())]

# Выводим числа в одну строку, разделённые пробелом
print(' '.join(map(str, sorted_numbers)))

Вывод программы: 8 18 11 15 5 4 14 9 19 1 7 17 6 16 10 13 3 12 20 2 0.

Как переписать данную программу таким образом, чтобы избежать написания названий чисел вручную? Ведь написать 20 чисел (точнее, 21) не так уж и трудно, ну а если бы их было 100 или 1000?

Ответы

▲ 4Принят

Можно попробовать вот так

# импортируем библиотеку перевода числа в слово
from num2words import num2words as n2w
# импортируем библиотеку перевода слова в числа
# работает только с английскийм языком
from words2num import w2n
# создаем последовательность от 0 до 20 сразу переводя в текст
lst = [n2w(x) for x in range(21)]
# сортируем
lst.sort()
# проходим по элементам списка и сортируем их обратно в число
for x in range(len(lst)):
    lst[x]=str(w2n(lst[x]))
# выводим
print(' '.join(lst))

Вывод:

8 18 11 15 5 4 14 9 19 1 7 17 6 16 10 13 3 12 20 2 0

Можем изменить код так, чтобы это все вышло в качестве функции, принимающая последовательность чисел (обработки писать не буду, просто дам как пример):

from num2words import num2words as n2w
from words2num import w2n
def NumberToWordsSort(x):
    for i in range(len(x)):
        x[i]=n2w(x[i])
    x.sort()
    for i in range(len(x)):
        x[i]=str(w2n(x[i]))
    return x

print(' '.join(NumberToWordsSort([x for x in range(21)])))