Python 日期顺序输出?

Python 日期顺序输出?,python,Python,我想知道在python中是否有一种快速简便的方法来输出给定数字的序号 例如,给定数字1,我想输出1,数字2,2,等等,等等 这是用于处理面包屑路径中的日期 Home > Venues > Bar Academy > 2009 > April > 01 是当前显示的内容 我想要一些类似于 Home > Venues > Bar Academy > 2009 > April > 1st 除了第一,第二和第三,我想他

我想知道在python中是否有一种快速简便的方法来输出给定数字的序号

例如,给定数字1,我想输出1,数字2,2,等等,等等

这是用于处理面包屑路径中的日期

Home >  Venues >  Bar Academy >  2009 >  April >  01 
是当前显示的内容

我想要一些类似于

Home >  Venues >  Bar Academy >  2009 >  April >  1st

除了第一,第二和第三,我想他们都只是增加了。。。第四、第五、第六、第十一、第二十一。。。哎呀,-

我认为这可能有效:

def ordinal(num):
     ldig = num % 10
     l2dig = (num // 10) % 10
     if l2dig == 1:
         suffix = 'th'
     elif ldig == 1:
         suffix = 'st'
     elif ldig == 2:
         suffix = 'nd'
     elif ldig == 3:
         suffix = 'rd'
     else: 
         suffix = 'th'
     return '%d%s' % (num, suffix)

或者用以下内容缩短David的答案:

if 4 <= day <= 20 or 24 <= day <= 30:
    suffix = "th"
else:
    suffix = ["st", "nd", "rd"][day % 10 - 1]

这里有一个更通用的解决方案:

def ordinal(n):
    if 10 <= n % 100 < 20:
        return str(n) + 'th'
    else:
       return  str(n) + {1 : 'st', 2 : 'nd', 3 : 'rd'}.get(n % 10, "th")
def foo(n):
    return str(n) + {1: 'st', 2: 'nd', 3: 'rd'}.get(4 if 10 <= n % 100 < 20 else n % 10, "th")

在这里,它使用字典作为函数或lambda

如果你向后看字典,你可以把它读成

一切都以“th”结尾

…除非它以1、2或3结尾,否则它以“st”、“nd”或“rd”结尾

…除非它以11、12或13结尾,否则它以“th”、“th”或“th”结尾

# as a function
def ordinal(num):
    return '%d%s' % (num, { 11: 'th', 12: 'th', 13: 'th' }.get(num % 100, { 1: 'st',2: 'nd',3: 'rd',}.get(num % 10, 'th')))

# as a lambda
ordinal = lambda num : '%d%s' % (num, { 11: 'th', 12: 'th', 13: 'th' }.get(num % 100, { 1: 'st',2: 'nd',3: 'rd',}.get(num % 10, 'th')))

下面是一个更短的通用解决方案:

def ordinal(n):
    if 10 <= n % 100 < 20:
        return str(n) + 'th'
    else:
       return  str(n) + {1 : 'st', 2 : 'nd', 3 : 'rd'}.get(n % 10, "th")
def foo(n):
    return str(n) + {1: 'st', 2: 'nd', 3: 'rd'}.get(4 if 10 <= n % 100 < 20 else n % 10, "th")

虽然上面的其他解决方案乍一看可能更容易理解,但在使用更少代码的情况下也同样有效。

修复了基于eric的负输入。frederich的nice sol'n在使用%时添加了abs:


一个更一般、更短的函数解决方案:

def get_ordinal(num)
    ldig = num % 10
    l2dig = (num // 10) % 10

    if (l2dig == 1) or (ldig > 3):
        return '%d%s' % (num, 'th')
    else:
        return '%d%s' % (num, {1: 'st', 2: 'nd', 3: 'rd'}.get(ldig))

我只是像deegeedubs一样将David的解决方案和库结合起来。你甚至可以替换变量ldig,l2dig作为真正的数学变量,因为l2dig只使用了一次,然后你就得到了四行代码。

我不得不从javascript转换一个脚本,在那里我有一个有用的fn复制了phps date obj。非常相似

def ord(n):
    return str(n)+("th" if 4<=n%100<=20 else {1:"st",2:"nd",3:"rd"}.get(n%10, "th"))

ps-我是从另一个被报告为重复的线程中得到的,但这并不完全是因为该线程也解决了日期问题

我想在我的一个项目中使用序数,经过一些原型之后,我认为这种方法虽然不小,但适用于任何正整数,是的,任何整数

它的工作原理是确定数字是大于还是小于20,如果数字小于20,它会将int 1转换为字符串1st、2、2nd;3、3;其余的将添加st

对于超过20的数字,需要最后一位和第二位到最后一位的数字,我分别称之为十位和单位,并对它们进行测试,看看要向数字添加什么

顺便说一句,这是在python中实现的,因此我不确定其他语言是否能够找到字符串上的最后一位或倒数第二位,如果它们这样做的话,那么它应该很容易翻译

def o(numb):
    if numb < 20: #determining suffix for < 20
        if numb == 1: 
            suffix = 'st'
        elif numb == 2:
            suffix = 'nd'
        elif numb == 3:
            suffix = 'rd'
        else:
            suffix = 'th'  
    else:   #determining suffix for > 20
        tens = str(numb)
        tens = tens[-2]
        unit = str(numb)
        unit = unit[-1]
        if tens == "1":
           suffix = "th"
        else:
            if unit == "1": 
                suffix = 'st'
            elif unit == "2":
                suffix = 'nd'
            elif unit == "3":
                suffix = 'rd'
            else:
                suffix = 'th'
    return str(numb)+ suffix
为了便于使用,我调用了函数o,并且可以通过导入文件名来调用该函数,我通过导入ordinal然后导入ordinal.onumber来调用该文件名

让我知道你的想法:D


另外,我已经在另一个序数问题上发布了这个答案,但我意识到这是一个更适用的问题,因为它是python。

不确定5年前当你问这个问题时它是否存在,但是这个包有一个功能来完成你想要的:

def ordinal(n):
    return ["th", "st", "nd", "rd"][n%10 if n%10<4 and not (10<n%100<14) else 0]
>>> import inflect
>>> p = inflect.engine()
>>> for i in range(1,32):
...     print p.ordinal(i)
...
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

这里有一个函数是我写的日历类程序的一部分,我不包括整个程序。它为大于0的任何数字添加正确的序号。我包括了一个循环来演示输出

def ordinals(num):
    # st, nums ending in '1' except '11'
    if num[-1] == '1' and num[-2:] != '11':
        return num + 'st'
    # nd, nums ending in '2' except '12'
    elif num[-1] == '2' and num[-2:] != '12':
        return num + 'nd'
    # rd, nums ending in '3' except '13'
    elif num[-1] == '3' and num[-2:] != '13':
        return num + 'rd'
    # th, all other nums
    else:
        return num + 'th'

data = ''

# print the first 366 ordinals (for leap year)
for i in range(1, 367):
    data += ordinals(str(i)) + '\n'

# print results to file
with open('ordinals.txt', 'w') as wf:
   wf.write(data)
这些天我用的是09年肯定没有的Arrow

>>> import arrow
>>> from datetime import datetime
>>> arrow.get(datetime.utcnow()).format('Do')
'27th'

我做了一个函数,在这种情况下似乎是有效的。只需传入一个date对象,它就会使用day来计算后缀。希望能有帮助

from datetime import date
def get_day_ordinal(d):

    sDay = '%dth'
    if d.day <= 10 or d.day >= 21:
        sDay = '%dst' if d.day % 10 == 1 else sDay
        sDay = '%dnd' if d.day % 10 == 2 else sDay
        sDay = '%drd' if d.day % 10 == 3 else sDay

    return sDay % d.day

d = date.today()
print get_day_ordinal(d)

我不知道if x,这种方法很难推广——如果你想用它来表示任意数字,它会变得很笨拙。没错,但OP问的是顺序日期。自从雅格尼以来,最好选择更简短、更优雅的解决方案来满足他的需求,即使它不能推广。如果有人想要一个通用的解决方案,你的是好的,尽管我可能会使用列表而不是其他的;第三行应该是:l2dig=num//10%10请注意,这对于负输入1仍然不起作用。很高兴我回来再看一次。这里的函数名ordinal不明确。