如果输入整数,则小于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
#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
以及11th
,12th
和13th
的特殊情况测试; 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)。
评论
离题(因为这是一个python问题,而不是.net),但是github.com/MehdiK/Humanizer具有扩展方法可以很好地完成这种事情,例如1.Ordinalize()==“ 1st”或“ 21”。 Ordinalize()==“ 21st”是的,有可能:使用num2words; def ordinal(num):num2words(num,to = ordinal_num,lang = en)
更少的代码行”很少是值得的目标;清晰而有效的通常比短要重要。