Как найти ближайшую дату занятия?
У меня есть функция определения ближайшей даты указанного дня недели:
def next_closest(from_date, search_day, message):
print(from_date)
print(search_day)
if isinstance(search_day, str):
search_day = WEEK_DAYS.index(search_day.lower())
from_day = from_date.weekday()
different_days = search_day - from_day if from_day < search_day else 7 - from_day + search_day
d=from_date + timedelta(days=different_days)
return next_func(d)
Также есть массив с предметами:
sub_rasp = {'0': ['История', 'биология', 'Химия', 'География', 'ИЗО', 'Технология', 'Алгебра'],
'1': ['Обществознание', 'Русский язык', 'Информатика(Малова)', 'Информатика(Чкалова)', 'Музыка',
'Англ.яз (Якушева)', 'Англ.яз (Васильева)', 'Физ-ра'],
'2': ['Физика', 'Физ-ра', 'Химия', 'Литература', 'Русский язык', 'Алгебра', 'Англ.яз (Якушева)',
'Англ.яз (Васильева)'],
'3': ['Русский язык', 'ОБЖ', 'Биология', 'Русский язык', 'Геометрия', 'Алгебра'],
'4': ['Литература', 'Физика', 'История', 'Алгебра', 'Англ.яз (Якушева)', 'Англ.яз (Васильева)', 'Геометрия',
'География']}
#0 - понедельник и т.д
Но не правильно работает определения дня занятия:
sub = n[0]
d = date.today()
# d = datetime.date(2020, 9, 21)
for i in sub_rasp:
if int(i) > int(d.weekday()):
print(f'{i} i > str(d.weekday())')
for y in sub_rasp:
print(f'\n{y}\n')
if y == sub:
print(f'{y} i > str(d.weekday())')
return next_closest(d, WEEK_DAYS[int(i)], message)
for i in sub_rasp:
if int(i) < int(d.weekday()):
print(f'{i} i < str(d.weekday())')
for y in sub_rasp[i]:
print(f'\n{y}\n')
if y == sub:
print(f'{y} i < str(d.weekday())')
return next_closest(d, WEEK_DAYS[int(i)], message)
for i in sub_rasp:
if int(i) == int(d.weekday()):
print(f'{i} i == str(d.weekday())')
for y in sub_rasp[i]:
print(f'\n{y}\n')
if y == sub:
print(f'{y} i == str(d.weekday())')
return next_closest(d, WEEK_DAYS[int(i)], message)
# if str(i) > str(d.weekday()):
# for y in sub_rasp[i]:
# if y == sub:
# print(WEEK_DAYS[int(i)])
# return next_closest(d, WEEK_DAYS[int(i)])
# elif i == str(d.weekday()):
# for y in sub_rasp[i]:
# if y == sub:
# return next_closest(d, WEEK_DAYS[int(i)])
# elif i < str(d.weekday()):
# for y in sub_rasp[i]:
# if y == sub:
# print(WEEK_DAYS[int(i)])
# return next_closest(d, WEEK_DAYS[int(i)])
В любом из двух вариантов, возвращает понедельник(0), но должен вернуть след. день(среда, 2), при выборе предмета Алгебра
Примеры: Если сегодня 29.09 и я выбрал Алгебра, то код должен выдать 2020-09-30. Если сегодня 02.10 и я выбрал Историю, то код должен выдать 2020-10-05 (Понед). Если сегодня 28.09 и я выбрал ИЗО, то код должен выдать 2020-10-5 Примеры на основании расписания (sub_rasp)
Ответы (1 шт):
Автор решения: gil9red
→ Ссылка
Накидал алгоритм, проверьте.
А так:
- Дни недели лучше изначально хранить как числа, а не строки, чтобы упростить дальнейшую с ними работу
- Давайте переменным понятные названия
- Думаю, лучше сразу сделать регистронезависимый поиск предмета, чтобы и
АЛГЕБРАилиалГеБранаходилиАлгебрусреди предметов, для этого вместо условияlesson in SCHEDULE[week_day]используйтеlesson in map(str.lower, SCHEDULE[week_day])и перед этим добавьтеlesson = lesson.lower()
import datetime as DT
from typing import Optional
SCHEDULE = {
0: ['История', 'Биология', 'Химия', 'География', 'ИЗО', 'Технология', 'Алгебра'],
1: ['Обществознание', 'Русский язык', 'Информатика(Малова)', 'Информатика(Чкалова)',
'Музыка', 'Англ.яз (Якушева)', 'Англ.яз (Васильева)', 'Физ-ра'],
2: ['Физика', 'Физ-ра', 'Химия', 'Литература', 'Русский язык', 'Алгебра',
'Англ.яз (Якушева)', 'Англ.яз (Васильева)'],
3: ['Русский язык', 'ОБЖ', 'Биология', 'Русский язык', 'Геометрия', 'Алгебра'],
4: ['Литература', 'Физика', 'История', 'Алгебра', 'Англ.яз (Якушева)',
'Англ.яз (Васильева)', 'Геометрия', 'География']
}
def get_nearest_lesson_date(lesson: str, d: DT.date = None) -> Optional[DT.date]:
if not d:
d = DT.date.today()
# Перебор дней недели
for i in range(7):
next_day = d + DT.timedelta(days=i+1)
week_day = next_day.weekday()
# Пропуск отсутствующих дней недели, например выходных
if week_day not in SCHEDULE:
continue
if lesson in SCHEDULE[week_day]:
return next_day
# Не нашли урок
return
Проверка:
print(get_nearest_lesson_date('Алгебра'))
# 2020-09-30
print(get_nearest_lesson_date('Алгебра', DT.date(2020, 9, 29)))
# 2020-09-30
print(get_nearest_lesson_date('История', DT.date(2020, 10, 2)))
# 2020-10-05
print(get_nearest_lesson_date('ИЗО', DT.date(2020, 9, 26)))
# 2020-09-28
print(get_nearest_lesson_date('ИЗО', DT.date(2020, 9, 27)))
# 2020-09-28
print(get_nearest_lesson_date('ИЗО', DT.date(2020, 9, 28)))
# 2020-10-05