125 lines
3.2 KiB
Python
125 lines
3.2 KiB
Python
"""课表数据处理工具函数"""
|
||
|
||
|
||
def convert_tuple_schedule_to_dict(schedule: list[tuple]) -> list[dict]:
|
||
"""将元组格式的课表转换为字典格式。
|
||
|
||
Args:
|
||
schedule: list[tuple],每个元组包含 (name, teacher, classroom, weeks, day, classes)
|
||
其中 weeks 可以是 list[int] 或 str(如 "1-17")
|
||
|
||
Returns:
|
||
list[dict]: 标准格式的课程数据
|
||
"""
|
||
result = []
|
||
for course in schedule:
|
||
# 确保元组长度足够,不足的补 None
|
||
padded = list(course) + [None] * (6 - len(course))
|
||
name, teacher, classroom, weeks, day, classes = padded[:6]
|
||
|
||
# 处理 weeks:支持 list 或 str(如 "1-17", "1,3,5-10")
|
||
weeks_list = []
|
||
if isinstance(weeks, list):
|
||
weeks_list = weeks
|
||
elif isinstance(weeks, str):
|
||
weeks_list = parse_weeks_string(weeks)
|
||
|
||
result.append({
|
||
"name": name,
|
||
"teacher": teacher,
|
||
"classroom": classroom,
|
||
"weeks": weeks_list,
|
||
"day": day if isinstance(day, int) else 1,
|
||
"classes": classes if isinstance(classes, list) else []
|
||
})
|
||
|
||
return result
|
||
|
||
|
||
def parse_weeks_string(weeks_str: str) -> list[int]:
|
||
"""将周数字符串解析为整数列表。
|
||
|
||
支持格式:
|
||
"1-17" -> [1,2,3,...,17]
|
||
"1,3,5" -> [1,3,5]
|
||
"1-5,7,9-11" -> [1,2,3,4,5,7,9,10,11]
|
||
|
||
Args:
|
||
weeks_str: 周数字符串
|
||
|
||
Returns:
|
||
list[int]: 周数列表
|
||
"""
|
||
if not weeks_str or not isinstance(weeks_str, str):
|
||
return []
|
||
|
||
result = []
|
||
parts = weeks_str.split(',')
|
||
|
||
for part in parts:
|
||
part = part.strip()
|
||
if '-' in part:
|
||
# 范围格式:1-17
|
||
try:
|
||
start, end = part.split('-', 1)
|
||
start = int(start.strip())
|
||
end = int(end.strip())
|
||
result.extend(range(start, end + 1))
|
||
except ValueError:
|
||
continue
|
||
else:
|
||
# 单个数字
|
||
try:
|
||
result.append(int(part))
|
||
except ValueError:
|
||
continue
|
||
|
||
# 去重并排序
|
||
return sorted(set(result))
|
||
|
||
|
||
def format_weeks(weeks: list[int]) -> str:
|
||
"""格式化周数显示,如 [1,2,3,5,6,7] -> "1-3,5-7" """
|
||
if not weeks:
|
||
return ''
|
||
|
||
weeks = sorted(set(weeks))
|
||
ranges = []
|
||
start = end = weeks[0]
|
||
|
||
for w in weeks[1:]:
|
||
if w == end + 1:
|
||
end = w
|
||
else:
|
||
if start == end:
|
||
ranges.append(str(start))
|
||
else:
|
||
ranges.append(f"{start}-{end}")
|
||
start = end = w
|
||
|
||
if start == end:
|
||
ranges.append(str(start))
|
||
else:
|
||
ranges.append(f"{start}-{end}")
|
||
|
||
return ','.join(ranges)
|
||
|
||
|
||
def get_period_time(period: int) -> str:
|
||
"""获取节次对应的时间(南邮标准时间)"""
|
||
time_map = {
|
||
1: '08:00',
|
||
2: '08:50',
|
||
3: '09:50',
|
||
4: '10:40',
|
||
5: '11:30',
|
||
6: '13:45',
|
||
7: '14:35',
|
||
8: '15:35',
|
||
9: '16:25',
|
||
10: '18:30',
|
||
11: '19:20',
|
||
12: '20:10'
|
||
}
|
||
return time_map.get(period, '')
|