平均为两年,写作[1858-60]

时间:2017-11-07 21:38:18

标签: python

在某些情况下,日期被写为'创建的ca. 1858年至60年代,人类读者将其理解为“创造于1858 - 1860年”。

因此,想象两个代表年数的整数。

a = 1858
b = 60

我希望能够获得a+b == 1859

我可以将它们解析为字符串,取前两个字符('18'),将较短的字符串连接起来并将它们解析回数字,当然,但是......这似乎有点圆了。

Pythonic的处理方法是什么?

5 个答案:

答案 0 :(得分:23)

我认为你正在犯这个错误。更简单的方法是将世纪添加到b,然后将它们用作正常数字,因为它们是等同的。

def add_century(n: int, from_century=1900) -> int:
    """add_century turns a two-digit year into a four-digit year.

    takes a two-digit year `n` and a four-digit year `from_century` and
    adds the leading two digits from the latter to the former.
    """

    century = from_century // 100 * 100
    return century + n

然后你可以这样做:

a, b = 1858, 60
b = add_century(b, from_century=a)
result = (a + b) / 2

以这种方式处理数字有两个好处。

首先,您要澄清您可能拥有的边缘情况。 明确地 将世纪从一个世纪添加到另一个世纪的结束年份,这清楚地表明如果代码应该返回错误的结果会发生什么。

其次,将对象转换为等同的术语并不是一个好主意,它在语言中是必需的,我们可以说,它比Python更少接受。快速转换使两个项目相等是一种简单的方法,可以确保您不会在路上混淆。

答案 1 :(得分:13)

这个版本完全适用于整数并处理跨世纪的界限:

{{1}}

答案 2 :(得分:1)

使用(dd)等正则表达式解析字符串以获取组XXYY-ZZ,这些组将存储为g1 g2和g3。

result = int(g1) * 1000 + (int(g2) + int(g3))/2

这当然假设前缀总是相同的。所以1890-10会打破...

它还假设前缀始终存在。

整体上做字符串连接和平均值似乎更好......

答案 3 :(得分:1)

试试这个:

a = 1858
b = 60

def average_year(a,b):
    c = int(str(a)[:2]) * 100
    a1 = int(str(a)[2:])
    return c + (b + a1)/2

print average_year(a,b)
> 1859

答案 4 :(得分:0)

如果您不想转换为字符串,那么......让我们做一些数学运算:

a = 1858
b = 60
cent = 0
s = 0
if a < 2000:
    s = a - 1000
    c, y = divmod(s, 100)
    cent = 1000
else:
     s = a - 2000
     cent = 2000
     c, y = divmod(s, 100)
avg = (b + y) / 2
result = cent + (c*100) + avg