Принимая в среднем два года, написанные как [1858-60]
Есть несколько случаев, когда дата написана как "созданная ок. 1858-60 ', где человеческий читатель понимал бы это как" созданный около 1858-1860 годов".
Как таковые, представьте два целых числа, представляющие годы.
a = 1858
b = 60
Я хочу получить a+b == 1859
.
Я мог бы разобрать их на строки, взять первые два символа ('18'
), конкатенировать более короткую строку и анализировать их обратно на цифры, конечно, но... это кажется немного круглым.
Каким будет питоновский способ справиться с этим?
Ответы
Ответ 1
Я думаю, вы собираетесь сделать это неправильно. Более легкий подход состоит в том, чтобы добавить век к 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. Быстрое преобразование, так что два элемента равнозначны, - это простой способ убедиться, что вы не путаете вещи по дороге.
Ответ 2
Эта версия полностью работает с целыми числами и обрабатывает границы между веками:
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
Ответ 3
Разберите строку с регулярным выражением, например (dd)
, чтобы получить группы XXYY-ZZ, которые будут сохранены как g1 g2 и g3.
result = int(g1) * 1000 + (int(g2) + int(g3))/2
Это, конечно, предполагает, что префикс всегда один и тот же. Так что 1890-10 сломается...
Он также предполагает, что префикс всегда существует.
В целом выполнение строки concat и average кажется лучше...
Ответ 4
попробуйте следующее:
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
Ответ 5
Mm, если вы не хотите конвертировать в строки... Позвольте сделать некоторые математические данные:
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