繁体   English   中英

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

[英]Listing Python datetime countdown in words accounting for plural

我一直在尝试使用正确的单词列出日期之间的时间,特别是我希望它能说明复数。 我知道我可以通过运行所有数字和if语句来做到这一点,但我真的希望找到一种更有效的方法来实现我的目标。

IE:我希望221 days, 1:17:06.996068datetime返回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.

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

如果您找不到更好的解决方案,可以编写“复数”功能:

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

你可以写一个pluralize ,然后建立这个答案

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'

我不得不做一些搜索来弄清楚多重十进制数量的规则是什么,我在英语语言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'

对于这个特殊的用例,因为单词很容易复数,你可以使用一个简单的复数函数,例如:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM