如果输入整数,则小于100时将其输出为序数。下面的代码可以正常工作,但我想知道它是否可以更简洁地编写。

def ordinal(self, num):
    """
      Returns ordinal number string from int, e.g. 1, 2, 3 becomes 1st, 2nd, 3rd, etc.
    """
    self.num = num
    n = int(self.num)
    if 4 <= n <= 20:
      suffix = 'th'
    elif n == 1 or (n % 10) == 1:
      suffix = 'st'
    elif n == 2 or (n % 10) == 2:
      suffix = 'nd'
    elif n == 3 or (n % 10) == 3:
      suffix = 'rd'
    elif n < 100:
      suffix = 'th'
    ord_num = str(n) + suffix
    return ord_num


评论

离题(因为这是一个python问题,而不是.net),但是github.com/MehdiK/Humanizer具有扩展方法可以很好地完成这种事情,例如1.Ordinalize()==“ 1st”或“ 21”。 Ordinalize()==“ 21st”

是的,有可能:使用num2words; def ordinal(num):num2words(num,to = ordinal_num,lang = en)

更少的代码行”很少是值得的目标;清晰而有效的通常比短要重要。

#1 楼

def ordinal(self, num):
    """
      Returns ordinal number string from int, e.g. 1, 2, 3 becomes 1st, 2nd, 3rd, etc.
    """


这似乎是一种方法,而不是独立的功能,令人怀疑。

    self.num = num


为什么要将输入存储在这里?鉴于此功能的目的似乎很奇怪。

    n = int(self.num)


怀疑这是一个好主意。您要转换什么?转换为int的确应该更接近此数字是否来自此数字。在没有进行此测试的情况下,尚不清楚4-20范围有何特别之处。

    if 4 <= n <= 20:


您不需要or。如果n == 1,则第二个条件仍然成立。

      suffix = 'th'
    elif n == 1 or (n % 10) == 1:


如果后缀> = 100会发生什么?您会收到错误消息。

      suffix = 'st'
    elif n == 2 or (n % 10) == 2:
      suffix = 'nd'
    elif n == 3 or (n % 10) == 3:
      suffix = 'rd'
    elif n < 100:
      suffix = 'th'


您无需将其分成两行。

这是我的版本:

    ord_num = str(n) + suffix
    return ord_num


评论


\ $ \ begingroup \ $
您看似正确的方法。实际上,这是我上课的一部分。我只是将其拉出并粘贴到这里。我应该对其进行功能化。对于那个很抱歉。
\ $ \ endgroup \ $
– holaymolay
2014年2月10日下午4:57

\ $ \ begingroup \ $
n用于简化字符并将字符数从“ self.num”减少到“ n”。 4到20之所以特别是因为它是“ th”后缀的很大一部分。我实际上在教程中找到的示例中看到了这一点。
\ $ \ endgroup \ $
– holaymolay
2014年2月10日下午5:29

\ $ \ begingroup \ $
这里是一行(实现是相同的):ordinal = lambda n:str(n)+ {1:'st',2:'nd',3:'rd'}。get(10 <= n%100 <= 20且n或n%10,'th')
\ $ \ endgroup \ $
– ejrb
2014-02-10 13:54



\ $ \ begingroup \ $
值得一提的是,对于收益的计算,意见不一。许多人(包括我本人)倾向于只返回结果,尽管函数越短,重要性就越小。
\ $ \ endgroup \ $
– DSM
2014年2月10日下午16:25

\ $ \ begingroup \ $
@DSM,出于好奇,为什么?从我的角度来看,分配给本地人只是为了返回似乎没有意义。
\ $ \ endgroup \ $
–温斯顿·埃韦特(Winston Ewert)
2014年2月11日,下午1:56

#2 楼

您可以使用三元表达式简化重复的n == 1 or (n % 10) == 1以及11th12th13th的特殊情况测试;

So:

i = n if (n < 20) else (n % 10)
if i == 1:
  suffix = 'st'
elif i == 2:
  suffix = 'nd'
elif i == 3:
  suffix = 'rd'
elif n < 100:
  suffix = 'th'


我想您也可以使用字典:

suffixes = { 1: "st", 2: "nd", 3: "rd" }
i = n if (n < 20) else (n % 10)
if 0 < i <= 3:
  suffix = suffixes[i]
elif n < 100:
  suffix = 'th'


或使用字典get可以提供默认值:

suffixes = { 1: "st", 2: "nd", 3: "rd" }
i = n if (n < 20) else (n % 10)
suffix = suffixes.get(i, 'th')


也许您可以将其简化为一行代码:

suffix = { 1: "st", 2: "nd", 3: "rd" }.get(n if (n < 20) else (n % 10), 'th')


(请注意,上面的内容可能有问题,因为我没有了解Python)。