将Python日期时间倒计时列入会计复数的单词中

时间:2018-03-24 04:18:14

标签: python python-3.x date datetime

我一直在努力创建一个功能,使用正确的单词列出日期之间的时间,特别是我希望它能说明复数。我知道我可以通过运行所有数字和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.

是否有任何类型的函数在单数或复数之间有效标记?

3 个答案:

答案 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']]

您可以使用它来构建用户可呈现的字符串。