[Python] Замена нормальных номеров


Answers

Принятый ответ на предыдущий вопрос имеет алгоритм для половины этого: он превращается "first" в 1 . Чтобы перейти оттуда в "1st" , сделайте что-нибудь вроде:

suffixes = ["th", "st", "nd", "rd", ] + ["th"] * 16
suffixed_num = str(num) + suffixes[num % 100]

Это работает только для чисел 0-19.

Question

В настоящее время я ищу способ заменить слова, такие как первый, второй, третий, ... с соответствующим порядковым номером (1-й, 2-й, 3-й). На прошлой неделе я искал поисковые запросы, и я не нашел ни одного полезного стандартного инструмента или какой-либо функции из NLTK.

Итак, есть ли какие-либо регулярные выражения или я должен писать вручную?

Спасибо за любой совет




Как насчет этого:

suf = lambda n: "%d%s"%(n,{1:"st",2:"nd",3:"rd"}.get(n if n<20 else n%10,"th"))
print [suf(n) for n in xrange(1,32)]

['1st', '2nd', '3rd', '4th', '5th', '6th', '7th', '8th', '9th', '10th',
 '11th', '12th', '13th', '14th', '15th', '16th', '17th', '18th', '19th',
 '20th', '21st', '22nd', '23rd', '24th', '25th', '26th', '27th', '28th',
 '29th', '30th', '31st']



эта функция хорошо работает для каждого числа n . Если n отрицательно, оно преобразуется в положительное. Если n не целое, оно преобразуется в целое.

def ordinal( n ):

    suffix = ['th', 'st', 'nd', 'rd', 'th', 'th', 'th', 'th', 'th', 'th']

    if n < 0:
        n *= -1

    n = int(n)

    if n % 100 in (11,12,13):
        s = 'th'
    else:
        s = suffix[n % 10]

    return str(n) + s



Если вы не хотите импортировать внешний модуль и предпочитаете однострочное решение, то, вероятно, (чуть-чуть) более читаемый, чем принятый ответ:

def suffix(i):
    return {1:"st", 2:"nd", 3:"rd"}.get(i%10*(i%100 not in [11,12,13]), "th"))

Он использует словарь .get , как предложено https://codereview.stackexchange.com/a/41300/90593 и https://.com/a/36977549/5069869 .

Я использовал умножение с булевым для обработки особых случаев (11,12,13) ​​без необходимости запуска if-блока. Если условие (i%100 not in [11,12,13]) значение False , целое число равно 0, и мы получаем случай по умолчанию.




Я приветствую лямбда-код Гарета. Так элегантно. Я лишь наполовину понимаю, как это работает. Поэтому я попытался разобрать его и придумал следующее:

def ordinal(integer):

    int_to_string = str(integer)

    if int_to_string == '1' or int_to_string == '-1':
        print int_to_string+'st'
        return int_to_string+'st';
    elif int_to_string == '2' or int_to_string == '-2':
        print int_to_string+'nd'
        return int_to_string+'nd';
    elif int_to_string == '3' or int_to_string == '-3':
        print int_to_string+'rd'
        return int_to_string+'rd';

    elif int_to_string[-1] == '1' and int_to_string[-2] != '1':
        print int_to_string+'st'
        return int_to_string+'st';
    elif int_to_string[-1] == '2' and int_to_string[-2] != '1':
        print int_to_string+'nd'
        return int_to_string+'nd';
    elif int_to_string[-1] == '3' and int_to_string[-2] != '1':
        print int_to_string+'rd'
        return int_to_string+'rd';

    else:
        print int_to_string+'th'
        return int_to_string+'th';


>>> print [ordinal(n) for n in range(1,25)]
1st
2nd
3rd
4th
5th
6th
7th
8th
9th
10th
11th
12th
13th
14th
15th
16th
17th
18th
19th
20th
21st
22nd
23rd
24th
['1st', '2nd', '3rd', '4th', '5th', '6th', '7th', '8th', '9th', '10th',             
'11th', '12th', '13th', '14th', '15th', '16th', '17th', '18th', '19th', 
'20th', '21st', '22nd', '23rd', '24th']