有一些情况下,日期被写作“created ca. 1858-60”,人类读者会理解为“创建于约1858年至1860年之间”。
因此,请想象两个代表年份的整数。
a = 1858
b = 60
我希望能够得到a+b == 1859
。
我可以将它们解析为字符串,取前两个字符('18'
),连接较短的字符串并将它们解析回数字,但这似乎有些绕弯子。
处理这个问题的Pythonic方式是什么?
有一些情况下,日期被写作“created ca. 1858-60”,人类读者会理解为“创建于约1858年至1860年之间”。
因此,请想象两个代表年份的整数。
a = 1858
b = 60
我希望能够得到a+b == 1859
。
我可以将它们解析为字符串,取前两个字符('18'
),连接较短的字符串并将它们解析回数字,但这似乎有些绕弯子。
处理这个问题的Pythonic方式是什么?
我认为你的方法不太对。更简单的方法是将世纪添加到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
处理数字的方式有两个好处。result
。 - Adam Smith这个版本完全使用整数,并处理跨世纪的边界:
def year_range_average(a, b):
return a + (b - (a % 100) + 100) % 100 // 2
>>> year_range_average(1858, 60)
1859
>>> year_range_average(1858, 61)
1859
>>> year_range_average(1858, 62)
1860
>>> year_range_average(1898, 2)
1900
(dd)
)解析字符串,获取XXYY-ZZ组,这些将存储为g1、g2和g3。result = int(g1) * 1000 + (int(g2) + int(g3))/2
try this:
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
嗯,如果你不想转换成字符串...那我们来做一些数学运算:
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
b
的世纪前缀总是与a
相同吗? - Cory Kramer1999-01
这个日期吗? - Adam Smith