Принимая в среднем два года, написанные как [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