在某些情况下,日期被写为'创建的ca. 1858年至60年代,人类读者将其理解为“创造于1858 - 1860年”。
因此,想象两个代表年数的整数。
a = 1858
b = 60
我希望能够获得a+b == 1859
。
我可以将它们解析为字符串,取前两个字符('18'
),将较短的字符串连接起来并将它们解析回数字,当然,但是......这似乎有点圆了。
Pythonic的处理方法是什么?
答案 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