#python #if-statement
Вопрос:
Этот код работает по назначению, но не очень элегантен. Я ищу разные точки зрения или лучшие методы получения одного и того же результата. Кроме того, если у вас есть какие-либо рекомендации по соглашениям об именах, когда речь заходит о переменных для удобства чтения кода, обратная связь приветствуется.
def get_oldest(date1, date2):
"""Given 2 date strings in "MM/DD/YYYY" format, return oldest one."""
date_one = date1.split("/")
date_two = date2.split("/")
if date_one[2] < date_two[2]:
return date1
elif date_one[2] > date_two[2]:
return date2
elif date_one[2] == date_two[2]:
if date_one[0] < date_two[0]:
return date1
elif date_one[0] > date_two[0]:
return date2
elif date_one[0] == date_two[0]:
if date_one[1] < date_two[1]:
return date1
elif date_one[1] > date_two[1]:
return date2
elif date_one[1] == date_two[1]:
return date1
get_oldest("06/21/1958", "06/24/1958")
Комментарии:
1. Вопросы, требующие проверки рабочего кода, лучше подходят для codereview.stackexchange.com . Тем не менее, почему бы не проанализировать ваши строки как даты, а затем просто сравнить даты вместо этого?
2. @shree.pat18 Спасибо за предложение, о котором я не знал в разделе обзора кода. Я также опубликую их. В данном конкретном случае профессор прямо сказал не использовать какие-либо модули, которые анализируют даты.
3. Рассмотрите небольшую функцию для повторного преобразования входных дат в целое число, например, мм/дд/гггг в ггггммдд, и просто используйте алгоритм сортировки для перестановки по мере необходимости и просто восстановите ввод даты из «целого числа».
4. @JasonChia Спасибо за предложение. Это то, что я сделал, и это работает! Спасибо!
Ответ №1:
Есть ли причины не использовать встроенную библиотеку datetime?
from datetime import datetime
def get_oldest(date1, date2):
date_one = datetime.strptime(date1, "%m/%d/%Y")
date_two = datetime.strptime(date2, "%m/%d/%Y")
if date_one < date_two:
return date_one
else:
return date_two
print(get_oldest("06/21/1958", "06/24/1958"))
print(get_oldest("01/23/2005", "12/31/2004"))
ВОЗВРАТ
1958-06-21 00:00:00
2004-12-31 00:00:00
Комментарии:
1. Фу-у, тебе бы
min()
тоже пригодилось:return min([date_one, date_two])
Ответ №2:
Шаг 1: Используйте нормальный формат даты. mm/dd/yyyy
это не нормальный формат даты.
Шаг 2: Используйте встроенную min()
функцию.
Нет никакого шага 3.
min(["1958-06-21", "1958-06-24"])
min()
ожидает список значений. Этот список может состоять из 1-N пунктов. Это хорошо работает для вашего случая (наименьшее из двух значений), но любой другой случай работает так же хорошо.
Комментарии:
1. Я изменил формат даты, и теперь он работает! Спасибо!
2. @Jack Take-away: Вы избавите себя от огромной головной боли, если никогда не будете использовать локализованные форматы дат в коде. Всегда используйте формат даты ISO или типы данных фактической даты для хранения и передачи дат. Вы всегда можете легко создавать локализованные форматы, например
mm/dd/yyyy
, с помощью стандартных функций форматирования даты , но вы должны использовать эти форматы только для отображения.