我一直在努力创建一个功能,使用正确的单词列出日期之间的时间,特别是我希望它能说明复数。我知道我可以通过运行所有数字和if语句来做到这一点,但我真的希望找到一种更有效的方法来实现我的目标。
IE:我希望221 days, 1:17:06.996068
中的datetime
作为221 days, 1 hour, 17 minutes, and 6.99 seconds.
返回。重要的是它说日/小时/分钟/秒或天/小时/分钟/秒
我的代码示例代码段:
from datetime import datetime as dt
now = dt.now(tz=None) # Current local computer time
test = dt(2018,3,25,23,0,0) # March 25th, 2018 23h 0m 0s
countdown = test - now
print(countdown) # 2 days, 1:45:00.685739
# Desired outcome: 2 days, 1 hour, 45 minutes, 0.68 seconds.
是否有任何类型的函数在单数或复数之间有效标记?
答案 0 :(得分:2)
如果您找不到更好的解决方案,可以写一个"复数"功能:
def pl(number,unit):
return unit + "s" if number > 1 or isinstance(number, float) else unit
pl(10, "hour")
#'hours'
pl(.75, "sec")
#'secs'
它至少会隐藏读者眼中的if
。
答案 1 :(得分:1)
您可以撰写pluralize
,然后在此answer上构建。
from datetime import datetime as dt
from collections import OrderedDict
def pluralize(amount, unit):
if amount != 1:
unit += 's'
return '{} {}'.format(amount, unit)
def format_delta(tdelta):
d = OrderedDict()
d["day"] = tdelta.days
d["hour"], rem = divmod(tdelta.seconds, 3600)
d["minute"], d["second"] = divmod(rem, 60)
return ', '.join(pluralize(v, k) for k, v in d.items() if v != 0)
now = dt.now(tz=None) # Current local computer time
test = dt(2018,3,25,23,0,0) # March 25th, 2018 23h 0m 0s
countdown = test - now
format_delta(countdown) # '1 day, 22 hours, 13 minutes, 1 second'
我不得不做一些搜索来弄清楚多元化数字的复数规则是什么,我找到了answer on English Language StackEchange。
一点点的普遍性。对于复数作为例外的名词,您必须以dict
的形式编写翻译表。
plurals = {
'maximum': 'maxima',
'index': 'indices',
'bar': 'baz'
}
def pluralize(amount, unit):
if amount != 1:
unit = plurals.get(unit, unit + 's')
return '{} {}'.format(amount, unit)
pluralize(2, 'maximum') # '2 maxima'
pluralize(2, 'cake') # '2 cakes'
答案 2 :(得分:1)
对于这个特殊的用例,因为单词很容易复数,你可以使用一个简单的复数函数,例如:
def pluralize(s, count):
if count > 1 or count == 0 or count < -1:
return s + "s"
else:
return s
然后关键的洞察力是要意识到你有两个相同大小的列表:第一个是数据集,第二个是数据的一组标签。这是zip()
组合子的完美用例!这个组合器有两个列表(例如:[1,2,3],[4,5,6])并将它们组合成一个对列表(例如:[1,4],[2,5],[3] ,6]。)
xs = [1, 12, 1, 46]
ys = ["day", "hour", "minute", "second"]
zs = map(lambda x: [x[0], pluralize(x[1], x[0])], zip(xs,ys))
然后在zs
中你最终得到:
> print(list(zs))
> [[1, 'day'], [12, 'hours'], [1, 'minute'], [46, 'seconds']]
您可以使用它来构建用户可呈现的字符串。